diff --git a/disabled/ccnb-parser/visitors/interest-visitor.cc b/disabled/ccnb-parser/visitors/interest-visitor.cc
index e7fe598..4e7b8ca 100644
--- a/disabled/ccnb-parser/visitors/interest-visitor.cc
+++ b/disabled/ccnb-parser/visitors/interest-visitor.cc
@@ -46,7 +46,7 @@
 
 // We don't care about any other fields
 void
-InterestVisitor::visit (Dtag &n, boost::any param/*should be InterestHeader* */)
+InterestVisitor::visit (Dtag &n, boost::any param/*should be Interest* */)
 {
   // uint32_t n.m_dtag;
   // std::list<Ptr<Block> > n.m_nestedBlocks;
@@ -56,7 +56,7 @@
   static TimestampVisitor          timestampVisitor;
   static Uint32tBlobVisitor        nonceVisitor;
   
-  InterestHeader &interest = *(boost::any_cast<InterestHeader*> (param));
+  Interest &interest = *(boost::any_cast<Interest*> (param));
 
   switch (n.m_dtag)
     {
diff --git a/disabled/ccnb-parser/visitors/interest-visitor.h b/disabled/ccnb-parser/visitors/interest-visitor.h
index f78d07f..38a969d 100644
--- a/disabled/ccnb-parser/visitors/interest-visitor.h
+++ b/disabled/ccnb-parser/visitors/interest-visitor.h
@@ -29,11 +29,11 @@
 
 /**
  * \ingroup ccnx-ccnb
- * \brief Visitor that fills fields in CcnxInterestHeader
+ * \brief Visitor that fills fields in CcnxInterest
  *
  * Usage example:
  * \code
- *   Ptr<CcnxInterestHeader> header = Create<CcnxInterestHeader> ();
+ *   Ptr<CcnxInterest> header = Create<CcnxInterest> ();
  *   Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
  *   InterestVisitor visitor;
  *   root->accept (visitor, *header); 
@@ -42,7 +42,7 @@
 class InterestVisitor : public VoidDepthFirstVisitor
 {
 public:
-  virtual void visit (Dtag &n, boost::any param/*should be CcnxInterestHeader* */);
+  virtual void visit (Dtag &n, boost::any param/*should be CcnxInterest* */);
 };
 
 } // namespace CcnbParser
diff --git a/disabled/ndn-content-object-header-ccnb.cc b/disabled/ndn-content-object-header-ccnb.cc
index 112f141..1f1a9f3 100644
--- a/disabled/ndn-content-object-header-ccnb.cc
+++ b/disabled/ndn-content-object-header-ccnb.cc
@@ -39,48 +39,48 @@
 
 #include <boost/foreach.hpp>
 
-NS_LOG_COMPONENT_DEFINE ("ndn.ContentObjectHeader");
+NS_LOG_COMPONENT_DEFINE ("ndn.ContentObject");
 
 namespace ns3 {
 namespace ndn {
 
 using namespace CcnbParser;
 
-const std::string ContentObjectHeader::Signature::DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
+const std::string ContentObject::Signature::DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
 
-NS_OBJECT_ENSURE_REGISTERED (ContentObjectHeader);
+NS_OBJECT_ENSURE_REGISTERED (ContentObject);
 NS_OBJECT_ENSURE_REGISTERED (ContentObjectTail);
 
 TypeId
-ContentObjectHeader::GetTypeId (void)
+ContentObject::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::ndn::ContentObjectHeader")
+  static TypeId tid = TypeId ("ns3::ndn::ContentObject")
     .SetGroupName ("Ndn")
     .SetParent<Header> ()
-    .AddConstructor<ContentObjectHeader> ()
+    .AddConstructor<ContentObject> ()
     ;
   return tid;
 }
 
-ContentObjectHeader::ContentObjectHeader ()
+ContentObject::ContentObject ()
 {
 }
 
 void
-ContentObjectHeader::SetName (const Ptr<Name> &name)
+ContentObject::SetName (const Ptr<Name> &name)
 {
   m_name = name;
 }
 
 const Name&
-ContentObjectHeader::GetName () const
+ContentObject::GetName () const
 {
-  if (m_name==0) throw ContentObjectHeaderException();
+  if (m_name==0) throw ContentObjectException();
   return *m_name;
 }
 
 Ptr<const Name>
-ContentObjectHeader::GetNamePtr () const
+ContentObject::GetNamePtr () const
 {
   return m_name;
 }
@@ -88,7 +88,7 @@
 #define CCNB EncodingHelper // just to simplify writing
 
 void
-ContentObjectHeader::Serialize (Buffer::Iterator start) const
+ContentObject::Serialize (Buffer::Iterator start) const
 {
   size_t written = 0;
   written += CCNB::AppendBlockHeader (start, CCN_DTAG_ContentObject, CCN_DTAG); // <ContentObject>
@@ -163,7 +163,7 @@
 }
 
 uint32_t
-ContentObjectHeader::GetSerializedSize () const
+ContentObject::GetSerializedSize () const
 {
   size_t written = 0;
   written += CCNB::EstimateBlockHeader (CCN_DTAG_ContentObject); // <ContentObject>
@@ -240,7 +240,7 @@
 class ContentObjectVisitor : public VoidDepthFirstVisitor
 {
 public:
-  virtual void visit (Dtag &n, boost::any param/*should be ContentObjectHeader* */)
+  virtual void visit (Dtag &n, boost::any param/*should be ContentObject* */)
   {
     // uint32_t n.m_dtag;
     // std::list<Ptr<Block> > n.m_nestedBlocks;
@@ -251,7 +251,7 @@
     static Uint32tBlobVisitor uint32tBlobVisitor;
     static ContentTypeVisitor contentTypeVisitor;
   
-    ContentObjectHeader &contentObject = *(boost::any_cast<ContentObjectHeader*> (param));
+    ContentObject &contentObject = *(boost::any_cast<ContentObject*> (param));
   
     switch (n.m_dtag)
       {
@@ -337,7 +337,7 @@
           throw CcnbDecodingException ();
 
         contentObject.GetSignedInfo ().SetContentType
-          (static_cast<ContentObjectHeader::ContentType>
+          (static_cast<ContentObject::ContentType>
            (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
                                        (contentTypeVisitor))));
         break;
@@ -394,7 +394,7 @@
 };
 
 uint32_t
-ContentObjectHeader::Deserialize (Buffer::Iterator start)
+ContentObject::Deserialize (Buffer::Iterator start)
 {
   static ContentObjectVisitor contentObjectVisitor;
 
@@ -406,13 +406,13 @@
 }
   
 TypeId
-ContentObjectHeader::GetInstanceTypeId (void) const
+ContentObject::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
   
 void
-ContentObjectHeader::Print (std::ostream &os) const
+ContentObject::Print (std::ostream &os) const
 {
   os << "D: " << GetName ();
   // os << "<ContentObject><Name>" << GetName () << "</Name><Content>";
@@ -481,7 +481,7 @@
 ///////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////
 
-ContentObjectHeader::SignedInfo::SignedInfo ()
+ContentObject::SignedInfo::SignedInfo ()
   : m_publisherPublicKeyDigest (0)
   // ,  m_timestamp
   , m_type (DATA)
@@ -492,61 +492,61 @@
 }
 
 void
-ContentObjectHeader::SignedInfo::SetPublisherPublicKeyDigest (uint32_t digest)
+ContentObject::SignedInfo::SetPublisherPublicKeyDigest (uint32_t digest)
 {
   m_publisherPublicKeyDigest = digest;
 }
 
 uint32_t
-ContentObjectHeader::SignedInfo::GetPublisherPublicKeyDigest () const
+ContentObject::SignedInfo::GetPublisherPublicKeyDigest () const
 {
   return m_publisherPublicKeyDigest;
 }
 
 void
-ContentObjectHeader::SignedInfo::SetTimestamp (const Time &timestamp)
+ContentObject::SignedInfo::SetTimestamp (const Time &timestamp)
 {
   m_timestamp = timestamp;
 }
 
 Time
-ContentObjectHeader::SignedInfo::GetTimestamp () const
+ContentObject::SignedInfo::GetTimestamp () const
 {
   return m_timestamp;
 }
 
 void
-ContentObjectHeader::SignedInfo::SetContentType (ContentObjectHeader::ContentType type)
+ContentObject::SignedInfo::SetContentType (ContentObject::ContentType type)
 {
   m_type = type;
 }
 
-ContentObjectHeader::ContentType
-ContentObjectHeader::SignedInfo::GetContentType () const
+ContentObject::ContentType
+ContentObject::SignedInfo::GetContentType () const
 {
   return m_type;
 }
 
 void
-ContentObjectHeader::SignedInfo::SetFreshness (const Time &freshness)
+ContentObject::SignedInfo::SetFreshness (const Time &freshness)
 {
   m_freshness = freshness;
 }
 
 Time
-ContentObjectHeader::SignedInfo::GetFreshness () const
+ContentObject::SignedInfo::GetFreshness () const
 {
   return m_freshness;
 }
 
 void
-ContentObjectHeader::SignedInfo::SetKeyLocator (Ptr<const Name> keyLocator)
+ContentObject::SignedInfo::SetKeyLocator (Ptr<const Name> keyLocator)
 {
   m_keyLocator = keyLocator;
 }
 
 Ptr<const Name>
-ContentObjectHeader::SignedInfo::GetKeyLocator () const
+ContentObject::SignedInfo::GetKeyLocator () const
 {
   return m_keyLocator;
 }
diff --git a/disabled/ndn-content-object-header-ccnb.h b/disabled/ndn-content-object-header-ccnb.h
index 06edcfd..8d58a65 100644
--- a/disabled/ndn-content-object-header-ccnb.h
+++ b/disabled/ndn-content-object-header-ccnb.h
@@ -43,7 +43,7 @@
  * Only few important fields are actually implemented in the simulation
  *
  *
- * ContentObjectHeader serializes/deserializes header up-to and including <Content> tags
+ * ContentObject serializes/deserializes header up-to and including <Content> tags
  * Necessary closing tags should be added using ContentObjectTail
  *
  * This hacks are necessary to optimize memory use (i.e., virtual payload)
@@ -51,7 +51,7 @@
  * "<ContentObject><Signature>..</Signature><Name>...</Name><SignedInfo>...</SignedInfo><Content>"
  * 
  */
-class ContentObjectHeader : public SimpleRefCount<ContentObjectHeader,Header>
+class ContentObject : public SimpleRefCount<ContentObject,Header>
 {
 public:
   ////////////////////////////////////////////////////////////////////////////  
@@ -226,7 +226,7 @@
    *
    * Creates a null header
    **/
-  ContentObjectHeader ();
+  ContentObject ();
 
   /**
    * \brief Set content object name
@@ -306,57 +306,57 @@
 };
 
 
-ContentObjectHeader::Signature::Signature ()
+ContentObject::Signature::Signature ()
   : m_digestAlgorithm ("99.0")
   , m_signatureBits (0)
 {
 }
 
 const std::string &
-ContentObjectHeader::Signature::GetDigestAlgorithm () const
+ContentObject::Signature::GetDigestAlgorithm () const
 {
   return m_digestAlgorithm;
 }
 
 void
-ContentObjectHeader::Signature::SetDigestAlgorithm (const std::string &digestAlgorithm)
+ContentObject::Signature::SetDigestAlgorithm (const std::string &digestAlgorithm)
 {
   m_digestAlgorithm = digestAlgorithm;
 }
 
 uint32_t
-ContentObjectHeader::Signature::GetSignatureBits () const
+ContentObject::Signature::GetSignatureBits () const
 {
   return m_signatureBits;
 }
 
 inline void
-ContentObjectHeader::Signature::SetSignatureBits (uint32_t signature)
+ContentObject::Signature::SetSignatureBits (uint32_t signature)
 {
   m_signatureBits = signature;
 }
 
 
-ContentObjectHeader::Signature &
-ContentObjectHeader::GetSignature ()
+ContentObject::Signature &
+ContentObject::GetSignature ()
 {
   return m_signature;
 }
 
-const ContentObjectHeader::Signature &
-ContentObjectHeader::GetSignature () const
+const ContentObject::Signature &
+ContentObject::GetSignature () const
 {
   return m_signature;
 }
 
-ContentObjectHeader::SignedInfo &
-ContentObjectHeader::GetSignedInfo ()
+ContentObject::SignedInfo &
+ContentObject::GetSignedInfo ()
 {
   return m_signedInfo;
 }
 
-const ContentObjectHeader::SignedInfo &
-ContentObjectHeader::GetSignedInfo () const
+const ContentObject::SignedInfo &
+ContentObject::GetSignedInfo () const
 {
   return m_signedInfo;
 }
@@ -365,7 +365,7 @@
  * @ingroup ndn-exceptions
  * @brief Class for ContentObject parsing exception 
  */
-class ContentObjectHeaderException {};
+class ContentObjectException {};
 
 } // namespace ndn
 } // namespace ns3
diff --git a/disabled/ndn-decoding-helper.cc b/disabled/ndn-decoding-helper.cc
index 89936c1..3984540 100644
--- a/disabled/ndn-decoding-helper.cc
+++ b/disabled/ndn-decoding-helper.cc
@@ -35,7 +35,7 @@
 namespace ndn {
 
 size_t
-DecodingHelper::Deserialize (Buffer::Iterator start, InterestHeader &interest)
+DecodingHelper::Deserialize (Buffer::Iterator start, Interest &interest)
 {
   static CcnbParser::InterestVisitor interestVisitor;
 
@@ -47,7 +47,7 @@
 }
 
 // size_t
-// NdnDecodingHelper::Deserialize (Buffer::Iterator start, NdnContentObjectHeader &contentObject)
+// NdnDecodingHelper::Deserialize (Buffer::Iterator start, NdnContentObject &contentObject)
 // {
 //   static CcnbParser::ContentObjectVisitor contentObjectVisitor;
 
diff --git a/disabled/ndn-decoding-helper.h b/disabled/ndn-decoding-helper.h
index 9e1f5ef..10b4dda 100644
--- a/disabled/ndn-decoding-helper.h
+++ b/disabled/ndn-decoding-helper.h
@@ -27,8 +27,8 @@
 namespace ns3 {
 namespace ndn {
 
-class InterestHeader;
-class ContentObjectHeader;
+class Interest;
+class ContentObject;
 
 /**
  * \brief Helper class to decode ccnb formatted Ndn message
@@ -37,22 +37,22 @@
 {
 public:
   /**
-   * \brief Deserialize Buffer::Iterator to NdnInterestHeader
+   * \brief Deserialize Buffer::Iterator to NdnInterest
    * @param start Buffer containing serialized Ndn message
-   * @param interest Pointer to the NdnInterestHeader to hold deserialized value
+   * @param interest Pointer to the NdnInterest to hold deserialized value
    * @return Number of bytes used for deserialization
    */
   static size_t
-  Deserialize (Buffer::Iterator start, InterestHeader &interest);
+  Deserialize (Buffer::Iterator start, Interest &interest);
 
   /**
-   * \brief Deserialize Buffer::Iterator to NdnContentObjectHeader
+   * \brief Deserialize Buffer::Iterator to NdnContentObject
    * @param start Buffer containing serialized Ndn message
-   * @param contentObject Pointer to the NdnContentObjectHeader to hold deserialized value
+   * @param contentObject Pointer to the NdnContentObject to hold deserialized value
    * @return Number of bytes used for deserialization
    */
   // static size_t
-  // Deserialize (Buffer::Iterator start, ContentObjectHeader &contentObject);
+  // Deserialize (Buffer::Iterator start, ContentObject &contentObject);
 };
 
 } // namespace ndn
diff --git a/disabled/ndn-encoding-helper.cc b/disabled/ndn-encoding-helper.cc
index 8ef3a7a..644ef7b 100644
--- a/disabled/ndn-encoding-helper.cc
+++ b/disabled/ndn-encoding-helper.cc
@@ -31,7 +31,7 @@
 namespace ndn {
 
 size_t
-EncodingHelper::Serialize (Buffer::Iterator start, const InterestHeader &interest)
+EncodingHelper::Serialize (Buffer::Iterator start, const Interest &interest)
 {
   size_t written = 0;
   written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Interest, CcnbParser::CCN_DTAG); // <Interest>
@@ -100,7 +100,7 @@
 }
 
 size_t
-EncodingHelper::GetSerializedSize (const InterestHeader &interest)
+EncodingHelper::GetSerializedSize (const Interest &interest)
 {
   size_t written = 0;
   written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Interest); // <Interest>
diff --git a/disabled/ndn-encoding-helper.h b/disabled/ndn-encoding-helper.h
index ab222ac..ae66684 100644
--- a/disabled/ndn-encoding-helper.h
+++ b/disabled/ndn-encoding-helper.h
@@ -33,8 +33,8 @@
 
 class Name;
 
-class InterestHeader;
-class ContentObjectHeader;
+class Interest;
+class ContentObject;
   
 /**
  * \brief Helper to encode/decode ccnb formatted Ndn message
@@ -43,26 +43,26 @@
 {
 public:
   /**
-   * \brief Serialize NdnInterestHeader to Buffer::Iterator
-   * @param start Buffer to store serialized NdnInterestHeader
-   * @param interest Pointer to NdnInterestHeader to be serialized 
-   * @return length of serialized NdnInterestHeader
+   * \brief Serialize NdnInterest to Buffer::Iterator
+   * @param start Buffer to store serialized NdnInterest
+   * @param interest Pointer to NdnInterest to be serialized 
+   * @return length of serialized NdnInterest
    */
   static size_t
-  Serialize (Buffer::Iterator start, const InterestHeader &interest);
+  Serialize (Buffer::Iterator start, const Interest &interest);
 
   /**
-   * \brief Compute the size of serialized NdnInterestHeader
-   * @param interest Pointer to NdnInterestHeader
+   * \brief Compute the size of serialized NdnInterest
+   * @param interest Pointer to NdnInterest
    * @return length 
    */
   static size_t
-  GetSerializedSize (const InterestHeader &interest);
+  GetSerializedSize (const Interest &interest);
   
 public:
   /**
    * @brief Append CCNB block header
-   * @param start Buffer to store serialized NdnInterestHeader
+   * @param start Buffer to store serialized NdnInterest
    * @param value dictionary id of the block header
    * @param block_type Type of CCNB block
    *
@@ -81,7 +81,7 @@
 
   /**
    * @brief Add number in CCNB encoding
-   * @param start Buffer to store serialized NdnInterestHeader
+   * @param start Buffer to store serialized NdnInterest
    * @param number Number to be written
    *
    * @returns written length
@@ -99,7 +99,7 @@
 
   /**
    * @brief Append CCNB closer tag (estimated size is 1)
-   * @param start Buffer to store serialized InterestHeader
+   * @param start Buffer to store serialized Interest
    *
    * @returns written length
    */
@@ -108,7 +108,7 @@
 
   /**
    * @brief Append Name in CCNB encoding
-   * @param start Buffer to store serialized InterestHeader
+   * @param start Buffer to store serialized Interest
    * @param name constant reference to Name object
    *
    * @returns written length
diff --git a/disabled/ndn-interest-header-ccnb.cc b/disabled/ndn-interest-header-ccnb.cc
index 438b906..1c4e3d6 100644
--- a/disabled/ndn-interest-header-ccnb.cc
+++ b/disabled/ndn-interest-header-ccnb.cc
@@ -31,26 +31,26 @@
 #include "../helper/ndn-encoding-helper.h"
 #include "../helper/ndn-decoding-helper.h"
 
-NS_LOG_COMPONENT_DEFINE ("ndn.InterestHeader");
+NS_LOG_COMPONENT_DEFINE ("ndn.Interest");
 
 namespace ns3 {
 namespace ndn {
 
-NS_OBJECT_ENSURE_REGISTERED (InterestHeader);
+NS_OBJECT_ENSURE_REGISTERED (Interest);
 
 TypeId
-InterestHeader::GetTypeId (void)
+Interest::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::ndn::InterestHeader")
+  static TypeId tid = TypeId ("ns3::ndn::Interest")
     .SetGroupName ("Ndn")
     .SetParent<Header> ()
-    .AddConstructor<InterestHeader> ()
+    .AddConstructor<Interest> ()
     ;
   return tid;
 }
   
 
-InterestHeader::InterestHeader ()
+Interest::Interest ()
   : m_name ()
   , m_minSuffixComponents (-1)
   , m_maxSuffixComponents (-1)
@@ -64,7 +64,7 @@
 {
 }
 
-InterestHeader::InterestHeader (const InterestHeader &interest)
+Interest::Interest (const Interest &interest)
   : m_name                (Create<Name> (interest.GetName ()))
   , m_minSuffixComponents (interest.m_minSuffixComponents)
   , m_maxSuffixComponents (interest.m_maxSuffixComponents)
@@ -78,158 +78,158 @@
 {
 }
 
-Ptr<InterestHeader>
-InterestHeader::GetInterest (Ptr<Packet> packet)
+Ptr<Interest>
+Interest::GetInterest (Ptr<Packet> packet)
 {
-  Ptr<InterestHeader> interest = Create<InterestHeader> ();
+  Ptr<Interest> interest = Create<Interest> ();
   packet->RemoveHeader (*interest);
 
   return interest;
 }
 
 void
-InterestHeader::SetName (Ptr<Name> name)
+Interest::SetName (Ptr<Name> name)
 {
   m_name = name;
 }
 
 const Name&
-InterestHeader::GetName () const
+Interest::GetName () const
 {
-  if (m_name==0) throw InterestHeaderException();
+  if (m_name==0) throw InterestException();
   return *m_name;
 }
 
 Ptr<const Name>
-InterestHeader::GetNamePtr () const
+Interest::GetNamePtr () const
 {
   return m_name;
 }
 
 void
-InterestHeader::SetMinSuffixComponents (int32_t value)
+Interest::SetMinSuffixComponents (int32_t value)
 {
   m_minSuffixComponents = value;
 }
 
 int32_t
-InterestHeader::GetMinSuffixComponents () const
+Interest::GetMinSuffixComponents () const
 {
   return m_minSuffixComponents;
 }
 
 void
-InterestHeader::SetMaxSuffixComponents (int32_t value)
+Interest::SetMaxSuffixComponents (int32_t value)
 {
   m_maxSuffixComponents = value;
 }
 
 int32_t
-InterestHeader::GetMaxSuffixComponents () const
+Interest::GetMaxSuffixComponents () const
 {
   return m_maxSuffixComponents;
 }
 
 void
-InterestHeader::SetExclude (Ptr<Name> exclude)
+Interest::SetExclude (Ptr<Name> exclude)
 {
   m_exclude = exclude;
 }
 
 bool
-InterestHeader::IsEnabledExclude () const
+Interest::IsEnabledExclude () const
 {
   return m_exclude!=0;
 }
 
 const Name&
-InterestHeader::GetExclude () const
+Interest::GetExclude () const
 {
-  if (m_exclude==0) throw InterestHeaderException();
+  if (m_exclude==0) throw InterestException();
   return *m_exclude;
 }
 
 void
-InterestHeader::SetChildSelector (bool value)
+Interest::SetChildSelector (bool value)
 {
   m_childSelector = value;
 }
 
 bool
-InterestHeader::IsEnabledChildSelector () const
+Interest::IsEnabledChildSelector () const
 {
   return m_childSelector;
 }
 
 void
-InterestHeader::SetAnswerOriginKind (bool value)
+Interest::SetAnswerOriginKind (bool value)
 {
   m_answerOriginKind = value;
 }
 
 bool
-InterestHeader::IsEnabledAnswerOriginKind () const
+Interest::IsEnabledAnswerOriginKind () const
 {
   return m_answerOriginKind;
 }
 
 void
-InterestHeader::SetScope (int8_t scope)
+Interest::SetScope (int8_t scope)
 {
   m_scope = scope;
 }
 
 int8_t
-InterestHeader::GetScope () const
+Interest::GetScope () const
 {
   return m_scope;
 }
 
 void
-InterestHeader::SetInterestLifetime (Time lifetime)
+Interest::SetInterestLifetime (Time lifetime)
 {
   m_interestLifetime = lifetime;
 }
 
 Time
-InterestHeader::GetInterestLifetime () const
+Interest::GetInterestLifetime () const
 {
   return m_interestLifetime;
 }
 
 void
-InterestHeader::SetNonce (uint32_t nonce)
+Interest::SetNonce (uint32_t nonce)
 {
   m_nonce = nonce;
 }
 
 uint32_t
-InterestHeader::GetNonce () const
+Interest::GetNonce () const
 {
   return m_nonce;
 }
 
 void
-InterestHeader::SetNack (uint32_t nackType)
+Interest::SetNack (uint32_t nackType)
 {
   m_nackType = nackType;
 }
 
 uint32_t
-InterestHeader::GetNack () const
+Interest::GetNack () const
 {
   return m_nackType;
 }
 
 uint32_t
-InterestHeader::GetSerializedSize (void) const
+Interest::GetSerializedSize (void) const
 {
   // unfortunately, we don't know exact header size in advance
   return EncodingHelper::GetSerializedSize (*this);
 }
     
 void
-InterestHeader::Serialize (Buffer::Iterator start) const
+Interest::Serialize (Buffer::Iterator start) const
 {
   size_t size = EncodingHelper::Serialize (start, *this);
   NS_UNUSED (size);
@@ -237,19 +237,19 @@
 }
 
 uint32_t
-InterestHeader::Deserialize (Buffer::Iterator start)
+Interest::Deserialize (Buffer::Iterator start)
 {
   return DecodingHelper::Deserialize (start, *this); // \todo Debugging is necessary
 }
 
 TypeId
-InterestHeader::GetInstanceTypeId (void) const
+Interest::GetInstanceTypeId (void) const
 {
   return GetTypeId ();
 }
   
 void
-InterestHeader::Print (std::ostream &os) const
+Interest::Print (std::ostream &os) const
 {
   os << "I: " << GetName ();
   
diff --git a/disabled/ndn-interest-header-ccnb.h b/disabled/ndn-interest-header-ccnb.h
index 819875a..1daa7d1 100644
--- a/disabled/ndn-interest-header-ccnb.h
+++ b/disabled/ndn-interest-header-ccnb.h
@@ -118,7 +118,7 @@
  **/
 
 /**
-  * @brief NDN InterestHeader and routines to serialize/deserialize
+  * @brief NDN Interest and routines to serialize/deserialize
   *
   * Simplifications:
   * - Name:  binary name components are not supported
@@ -129,7 +129,7 @@
   * - InterestLifetime: ?
   * - Nonce: 32 bit random integer.  If value is 0, will not be serialized
   **/
-class InterestHeader : public SimpleRefCount<InterestHeader, Header>
+class Interest : public SimpleRefCount<Interest, Header>
 {
 public:
   /**
@@ -137,12 +137,12 @@
    *
    * Creates a null header
    **/
-  InterestHeader ();
+  Interest ();
 
   /**
    * @brief Copy constructor
    */
-  InterestHeader (const InterestHeader &interest);
+  Interest (const Interest &interest);
 
   /**
    * \brief Set interest name
@@ -391,7 +391,7 @@
   /**
    * @brief Cheat for python bindings
    */
-  static Ptr<InterestHeader>
+  static Ptr<Interest>
   GetInterest (Ptr<Packet> packet);
   
 private:
@@ -411,7 +411,7 @@
  * @ingroup ndn-exceptions
  * @brief Class for Interest parsing exception 
  */
-class InterestHeaderException {};
+class InterestException {};
 
 } // namespace ndn
 } // namespace ns3
