diff --git a/model/ndn-content-object-header.cc b/model/ndn-content-object-header.cc
index 1a31abb..3688a89 100644
--- a/model/ndn-content-object-header.cc
+++ b/model/ndn-content-object-header.cc
@@ -22,20 +22,6 @@
 #include "ndn-content-object-header.h"
 
 #include "ns3/log.h"
-#include "../helper/ndn-encoding-helper.h"
-#include "../helper/ndn-decoding-helper.h"
-
-#include "../helper/ccnb-parser/common.h"
-#include "../helper/ccnb-parser/visitors/void-depth-first-visitor.h"
-#include "../helper/ccnb-parser/visitors/name-components-visitor.h"
-#include "../helper/ccnb-parser/visitors/non-negative-integer-visitor.h"
-#include "../helper/ccnb-parser/visitors/timestamp-visitor.h"
-#include "../helper/ccnb-parser/visitors/string-visitor.h"
-#include "../helper/ccnb-parser/visitors/uint32t-blob-visitor.h"
-#include "../helper/ccnb-parser/visitors/content-type-visitor.h"
-
-#include "../helper/ccnb-parser/syntax-tree/block.h"
-#include "../helper/ccnb-parser/syntax-tree/dtag.h"
 
 #include <boost/foreach.hpp>
 
@@ -44,10 +30,6 @@
 namespace ns3 {
 namespace ndn {
 
-using namespace CcnbParser;
-
-const std::string ContentObjectHeader::Signature::DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
-
 NS_OBJECT_ENSURE_REGISTERED (ContentObjectHeader);
 NS_OBJECT_ENSURE_REGISTERED (ContentObjectTail);
 
@@ -85,323 +67,78 @@
   return m_name;
 }
 
-#define CCNB EncodingHelper // just to simplify writing
+uint32_t
+ContentObjectHeader::GetSerializedSize () const
+{
+  uint32_t size = 2 + ((2 + 1) + (m_name->GetSerializedSize ()) + (2 + 2 + 4 + 2 + 2 + (2 + 0)));
+  NS_LOG_INFO ("Serialize size = " << size);
+  return size;
+}
 
 void
 ContentObjectHeader::Serialize (Buffer::Iterator start) const
 {
-  size_t written = 0;
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_ContentObject, CCN_DTAG); // <ContentObject>
+  start.WriteU8 (0x80); // version
+  start.WriteU8 (0x01); // packet type
 
-  // fake signature
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_Signature, CCN_DTAG); // <Signature>
-  // Signature ::= √DigestAlgorithm? 
-  //               Witness?         
-  //               √SignatureBits
-  if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
-    {
-      written += CCNB::AppendString (start, CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
-    }
-  written += CCNB::AppendTaggedBlob (start, CCN_DTAG_SignatureBits, GetSignature ().GetSignatureBits ()); // <SignatureBits />
-  written += CCNB::AppendCloser (start);                                    // </Signature>  
+  start.WriteU16 (2); // signature length
+  start.WriteU16 (0); // empty signature
 
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_Name, CCN_DTAG);    // <Name>
-  written += CCNB::AppendNameComponents (start, GetName()); //   <Component>...</Component>...
-  written += CCNB::AppendCloser (start);                                  // </Name>  
+  // name
+  uint32_t offset = m_name->Serialize (start);
+  start.Next (offset);
 
-  // fake signature
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_SignedInfo, CCN_DTAG); // <SignedInfo>
-  // SignedInfo ::= √PublisherPublicKeyDigest
-  //                √Timestamp
-  //                √Type?
-  //                √FreshnessSeconds?
-  //                FinalBlockID?
-  //                KeyLocator?
-  written += CCNB::AppendTaggedBlob (start, CCN_DTAG_PublisherPublicKeyDigest,         // <PublisherPublicKeyDigest>...
-                                     GetSignedInfo ().GetPublisherPublicKeyDigest ());
-  
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_Timestamp, CCN_DTAG);            // <Timestamp>...
-  written += CCNB::AppendTimestampBlob (start, GetSignedInfo ().GetTimestamp ());
-  written += CCNB::AppendCloser (start);
+  // content
+  // for now assume that contentdata length is zero
+  start.WriteU16 (2 + 4 + 2 + 2 + (2 + 0));
+  start.WriteU16 (4 + 2 + 2 + (2 + 0));
+  start.WriteU32 (static_cast<uint32_t> (m_timestamp.ToInteger (Time::S)));
+  start.WriteU16 (static_cast<uint16_t> (m_freshness.ToInteger (Time::S)));
+  start.WriteU16 (0); // reserved 
+  start.WriteU16 (0); // Length (ContentInfoOptions)
 
-  if (GetSignedInfo ().GetContentType () != DATA)
-    {
-      uint8_t type[3];
-      type[0] = (GetSignedInfo ().GetContentType () >> 16) & 0xFF;
-      type[1] = (GetSignedInfo ().GetContentType () >> 8 ) & 0xFF;
-      type[2] = (GetSignedInfo ().GetContentType ()      ) & 0xFF;
-      
-      written += CCNB::AppendTaggedBlob (start, CCN_DTAG_Type, type, 3);
-    }
-  if (GetSignedInfo ().GetFreshness () > Seconds(0))
-    {
-      written += CCNB::AppendBlockHeader (start, CCN_DTAG_FreshnessSeconds, CCN_DTAG);
-      written += CCNB::AppendNumber (start, GetSignedInfo ().GetFreshness ().ToInteger (Time::S));
-      written += CCNB::AppendCloser (start);
-    }
-  if (GetSignedInfo ().GetKeyLocator () != 0)
-    {
-      written += CCNB::AppendBlockHeader (start, CCN_DTAG_KeyLocator, CCN_DTAG); // <KeyLocator>
-      {
-        written += CCNB::AppendBlockHeader (start, CCN_DTAG_KeyName, CCN_DTAG);    // <KeyName>
-        {
-          written += CCNB::AppendBlockHeader (start, CCN_DTAG_Name, CCN_DTAG);       // <Name>
-          written += CCNB::AppendNameComponents (start, GetName());                  //   <Component>...</Component>...
-          written += CCNB::AppendCloser (start);                                     // </Name>
-        }
-        written += CCNB::AppendCloser (start);                                     // </KeyName>
-      }
-      written += CCNB::AppendCloser (start);                                     // </KeyLocator>
-    }
-  
-  written += CCNB::AppendCloser (start);                                     // </SignedInfo>
-
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_Content, CCN_DTAG); // <Content>
-
-  // there are no closing tags !!!
-  // The closing tag is handled by ContentObjectTail
+  // that's it folks
 }
 
-uint32_t
-ContentObjectHeader::GetSerializedSize () const
-{
-  size_t written = 0;
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_ContentObject); // <ContentObject>
-
-  // fake signature
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_Signature); // <Signature>
-  // Signature ::= DigestAlgorithm? 
-  //               Witness?         
-  //               SignatureBits   
-  if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
-    {
-      written += CCNB::EstimateString (CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
-    }
-  written += CCNB::EstimateTaggedBlob (CCN_DTAG_SignatureBits,
-                                       sizeof (GetSignature ().GetSignatureBits ()));      // <SignatureBits />
-  written += 1;                                    // </Signature>  
-
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_Name);    // <Name>
-  written += CCNB::EstimateNameComponents (GetName()); //   <Component>...</Component>...
-  written += 1;                                  // </Name>  
-
-  // fake signature
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_SignedInfo); // <SignedInfo>
-  // SignedInfo ::= √PublisherPublicKeyDigest
-  //                √Timestamp
-  //                √Type?
-  //                √FreshnessSeconds?
-  //                FinalBlockID?
-  //                KeyLocator?
-  
-  written += CCNB::EstimateTaggedBlob (CCN_DTAG_PublisherPublicKeyDigest,                          // <PublisherPublicKeyDigest>...
-                                       sizeof (GetSignedInfo ().GetPublisherPublicKeyDigest ()));
-  
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_Timestamp);                  // <Timestamp>...
-  written += CCNB::EstimateTimestampBlob (GetSignedInfo ().GetTimestamp ());
-  written += 1;
-
-  if (GetSignedInfo ().GetContentType () != DATA)
-    {
-      written += CCNB::EstimateTaggedBlob (CCN_DTAG_Type, 3);
-    }
-  if (GetSignedInfo ().GetFreshness () > Seconds(0))
-    {
-      written += CCNB::EstimateBlockHeader (CCN_DTAG_FreshnessSeconds);
-      written += CCNB::EstimateNumber (GetSignedInfo ().GetFreshness ().ToInteger (Time::S));
-      written += 1;
-    }
-
-  if (GetSignedInfo ().GetKeyLocator () != 0)
-    {
-      written += CCNB::EstimateBlockHeader (CCN_DTAG_KeyLocator); // <KeyLocator>
-      {
-        written += CCNB::EstimateBlockHeader (CCN_DTAG_KeyName);    // <KeyName>
-        {
-          written += CCNB::EstimateBlockHeader (CCN_DTAG_Name);       // <Name>
-          written += CCNB::EstimateNameComponents (GetName());        //   <Component>...</Component>...
-          written += 1;                                               // </Name>
-        }
-        written += 1;                                               // </KeyName>
-      }
-      written += 1;                                               // </KeyLocator>
-    }
-  
-  written += 1; // </SignedInfo>
-
-  written += CCNB::EstimateBlockHeader (CCN_DTAG_Content); // <Content>
-
-  // there are no closing tags !!!
-  // The closing tag is handled by ContentObjectTail
-  return written;
-}
-#undef CCNB
-
-class ContentObjectVisitor : public VoidDepthFirstVisitor
-{
-public:
-  virtual void visit (Dtag &n, boost::any param/*should be ContentObjectHeader* */)
-  {
-    // uint32_t n.m_dtag;
-    // std::list<Ptr<Block> > n.m_nestedBlocks;
-    static NameComponentsVisitor nameComponentsVisitor;
-    static NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
-    static TimestampVisitor          timestampVisitor;
-    static StringVisitor     stringVisitor;
-    static Uint32tBlobVisitor uint32tBlobVisitor;
-    static ContentTypeVisitor contentTypeVisitor;
-  
-    ContentObjectHeader &contentObject = *(boost::any_cast<ContentObjectHeader*> (param));
-  
-    switch (n.m_dtag)
-      {
-      case CCN_DTAG_ContentObject:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }
-        break;
-      case CCN_DTAG_Name:
-        {
-          // process name components
-          Ptr<NameComponents> name = Create<NameComponents> ();
-        
-          BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-            {
-              block->accept (nameComponentsVisitor, &(*name));
-            }
-          contentObject.SetName (name);
-          break;
-        }
-
-      case CCN_DTAG_Signature: 
-        // process nested blocks
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }      
-        break;
-
-      case CCN_DTAG_DigestAlgorithm:
-        NS_LOG_DEBUG ("DigestAlgorithm");
-        if (n.m_nestedTags.size ()!=1) // should be exactly one UDATA inside this tag
-          throw CcnbDecodingException ();
-        
-        contentObject.GetSignature ().SetDigestAlgorithm
-          (boost::any_cast<std::string> ((*n.m_nestedTags.begin())->accept
-                                         (stringVisitor)));
-        break;
-
-      case CCN_DTAG_SignatureBits:
-        NS_LOG_DEBUG ("SignatureBits");
-        if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-          throw CcnbDecodingException ();
-
-        contentObject.GetSignature ().SetSignatureBits
-          (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                      (uint32tBlobVisitor)));
-        break;
-
-      case CCN_DTAG_SignedInfo:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }      
-        break;
-      
-      case CCN_DTAG_PublisherPublicKeyDigest:
-        NS_LOG_DEBUG ("PublisherPublicKeyDigest");
-        if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-          throw CcnbDecodingException ();
-
-        contentObject.GetSignedInfo ().SetPublisherPublicKeyDigest
-          (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                      (uint32tBlobVisitor)));
-        break;
-
-      case CCN_DTAG_Timestamp:
-        NS_LOG_DEBUG ("Timestamp");
-        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
-          throw CcnbDecodingException ();
-
-        contentObject.GetSignedInfo ().SetTimestamp
-          (boost::any_cast<Time> ((*n.m_nestedTags.begin())->accept
-                                  (timestampVisitor)));
-        break;
-
-      case CCN_DTAG_Type:
-        NS_LOG_DEBUG ("Type");
-        if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-          throw CcnbDecodingException ();
-
-        contentObject.GetSignedInfo ().SetContentType
-          (static_cast<ContentObjectHeader::ContentType>
-           (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                       (contentTypeVisitor))));
-        break;
-        
-      case CCN_DTAG_FreshnessSeconds:
-        NS_LOG_DEBUG ("FreshnessSeconds");
-      
-        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
-          throw CcnbDecodingException ();
-        
-        contentObject.GetSignedInfo ().SetFreshness
-          (Seconds
-           (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                       (nonNegativeIntegerVisitor))));
-        break;
-      
-      case CCN_DTAG_KeyLocator:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }      
-        break;
-
-      case CCN_DTAG_KeyName:
-        {
-          if (n.m_nestedTags.size ()!=1) // should be exactly one nested tag
-            throw CcnbDecodingException ();
-
-          Ptr<BaseTag> nameTag = DynamicCast<BaseTag>(n.m_nestedTags.front ());
-          if (nameTag == 0)
-            throw CcnbDecodingException ();
-
-          // process name components
-          Ptr<NameComponents> name = Create<NameComponents> ();
-        
-          BOOST_FOREACH (Ptr<Block> block, nameTag->m_nestedTags)
-            {
-              block->accept (nameComponentsVisitor, &(*name));
-            }
-          contentObject.GetSignedInfo ().SetKeyLocator (name);
-          break;
-        }
-
-      case CCN_DTAG_Content: // !!! HACK
-        // This hack was necessary for memory optimizations (i.e., content is virtual payload)
-        NS_ASSERT_MSG (n.m_nestedTags.size() == 0, "Parser should have stopped just after processing <Content> tag");
-        break;
-      
-      default: // ignore all other stuff
-        break;
-      }
-  }
-};
 
 uint32_t
 ContentObjectHeader::Deserialize (Buffer::Iterator start)
 {
-  static ContentObjectVisitor contentObjectVisitor;
-
   Buffer::Iterator i = start;
-  Ptr<Block> root = Block::ParseBlock (i);
-  root->accept (contentObjectVisitor, this);
 
+  if (i.ReadU8 () != 0x80)
+    throw new ContentObjectHeaderException ();
+
+  if (i.ReadU8 () != 0x01)
+    throw new ContentObjectHeaderException ();
+
+  if (i.ReadU16 () != 2) // signature length
+    throw new ContentObjectHeaderException ();
+  
+  if (i.ReadU16 () != 0) // signature type
+    throw new ContentObjectHeaderException ();
+
+  m_name = Create<NameComponents> ();
+  uint32_t offset = m_name->Deserialize (start);
+  i.Next (offset);
+
+  if (i.ReadU16 () != (2 + 4 + 2 + 2 + (2 + 0))) // content length
+    throw new ContentObjectHeaderException ();
+
+  if (i.ReadU16 () != (4 + 2 + 2 + (2 + 0))) // Length (content Info)
+    throw new ContentObjectHeaderException ();
+
+  m_timestamp = Seconds (i.ReadU32 ());
+  m_freshness = Seconds (i.ReadU16 ());
+
+  if (i.ReadU16 () != 0) // Reserved
+    throw new ContentObjectHeaderException ();
+  if (i.ReadU16 () != 0) // Length (ContentInfoOptions)
+    throw new ContentObjectHeaderException ();
+
+  NS_ASSERT_MSG (i.GetDistanceFrom (start) != GetSerializedSize (),
+                 "Something wrong with ContentObjectHeader::Deserialize");
+  
   return i.GetDistanceFrom (start);
 }
   
@@ -443,112 +180,24 @@
 void
 ContentObjectTail::Print (std::ostream &os) const
 {
-  os << "</Content></ContentObject>";
+  // os << "</Content></ContentObject>";
 }
 
 uint32_t
 ContentObjectTail::GetSerializedSize (void) const
 {
-  return 2;
+  return 0;
 }
 
 void
 ContentObjectTail::Serialize (Buffer::Iterator start) const
 {
-  Buffer::Iterator i = start;
-  i.Prev (2); // Trailer interface requires us to go backwards
-  
-  i.WriteU8 (0x00); // </Content>
-  i.WriteU8 (0x00); // </ContentObject>
 }
 
 uint32_t
 ContentObjectTail::Deserialize (Buffer::Iterator start)
 {
-  Buffer::Iterator i = start;
-  i.Prev (2); // Trailer interface requires us to go backwards
-
-  uint8_t closing_tag_content = i.ReadU8 ();
-  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)");
-
-  return 2;
-}
-
-///////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////
-
-ContentObjectHeader::SignedInfo::SignedInfo ()
-  : m_publisherPublicKeyDigest (0)
-  // ,  m_timestamp
-  , m_type (DATA)
-  // , m_freshness
-  // , FinalBlockID
-  // , KeyLocator
-{
-}
-
-void
-ContentObjectHeader::SignedInfo::SetPublisherPublicKeyDigest (uint32_t digest)
-{
-  m_publisherPublicKeyDigest = digest;
-}
-
-uint32_t
-ContentObjectHeader::SignedInfo::GetPublisherPublicKeyDigest () const
-{
-  return m_publisherPublicKeyDigest;
-}
-
-void
-ContentObjectHeader::SignedInfo::SetTimestamp (const Time &timestamp)
-{
-  m_timestamp = timestamp;
-}
-
-Time
-ContentObjectHeader::SignedInfo::GetTimestamp () const
-{
-  return m_timestamp;
-}
-
-void
-ContentObjectHeader::SignedInfo::SetContentType (ContentObjectHeader::ContentType type)
-{
-  m_type = type;
-}
-
-ContentObjectHeader::ContentType
-ContentObjectHeader::SignedInfo::GetContentType () const
-{
-  return m_type;
-}
-
-void
-ContentObjectHeader::SignedInfo::SetFreshness (const Time &freshness)
-{
-  m_freshness = freshness;
-}
-
-Time
-ContentObjectHeader::SignedInfo::GetFreshness () const
-{
-  return m_freshness;
-}
-
-void
-ContentObjectHeader::SignedInfo::SetKeyLocator (Ptr<const NameComponents> keyLocator)
-{
-  m_keyLocator = keyLocator;
-}
-
-Ptr<const NameComponents>
-ContentObjectHeader::SignedInfo::GetKeyLocator () const
-{
-  return m_keyLocator;
+  return 0;
 }
 
 } // namespace ndn
diff --git a/model/ndn-content-object-header.h b/model/ndn-content-object-header.h
index 64fc3e5..79f04df 100644
--- a/model/ndn-content-object-header.h
+++ b/model/ndn-content-object-header.h
@@ -38,14 +38,19 @@
 namespace ndn {
 
 /**
- * Ndn XML definition of ContentObject
+ * ContentObject header
  * 
  * Only few important fields are actually implemented in the simulation
  *
- *
  * ContentObjectHeader serializes/deserializes header up-to and including <Content> tags
  * Necessary closing tags should be added using ContentObjectTail
  *
+ * Optimized and simplified formatting of Interest packets 
+ *
+ *	ContentObject ::= Signature
+ *                	  Name
+ *                   	  Content
+ *
  * This hacks are necessary to optimize memory use (i.e., virtual payload)
  *
  * "<ContentObject><Signature>..</Signature><Name>...</Name><SignedInfo>...</SignedInfo><Content>"
@@ -54,173 +59,6 @@
 class ContentObjectHeader : public SimpleRefCount<ContentObjectHeader,Header>
 {
 public:
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  /**
-   * @brief Class representing Signature section of the content object
-   */
-  class Signature
-  {
-  public:
-    /**
-     * @brief Default constructor. Creates a fake-type signature
-     */
-    inline Signature ();
-
-    /**
-     * @brief Get digest algorithm
-     */
-    inline const std::string &
-    GetDigestAlgorithm () const;
-
-    /**
-     * @brief Set digest algorithm
-     */
-    inline void
-    SetDigestAlgorithm (const std::string &digestAlgorithm);
-
-    /**
-     * @brief Get signature bits
-     */
-    inline uint32_t
-    GetSignatureBits () const;
-
-    /**
-     * @brief Set signature bits
-     */
-    inline void
-    SetSignatureBits (uint32_t signatureBits);
-
-    /**
-     * @brief Default digest algorithm ("2.16.840.1.101.3.4.2.1")
-     */
-    static const std::string DefaultDigestAlgorithm; // = "2.16.840.1.101.3.4.2.1";
-    
-  private:
-    std::string m_digestAlgorithm; // if value is `2.16.840.1.101.3.4.2.1`, then SHA-256 (not supported)
-                                   // in NS-3 value `99.0` represents a fake digest
-    // Witness // not used in NS-3
-    uint32_t m_signatureBits; // in NS-3 a fake signature is a just 32-bits
-  };
-  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-
-  /**
-   * @brief Options for the data packet Type
-   */
-  enum ContentType
-    {
-      DATA = 0x0C04C0, // default value. If ContentObject is type of DATA, then ContentType tag will be omitted
-      ENCR = 0x10D091,
-      GONE = 0x18E344,
-      KEY  = 0x28463F,
-      LINK = 0x2C834A,
-      NACK = 0x34008A
-    };
-
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-
-  /**
-   * @brief Class representing SignedInfo section of the content object
-   */
-  class SignedInfo
-  {
-  public:
-    /**
-     * @brief Default constructor
-     */
-    SignedInfo (); 
-    
-    /**
-     * @brief Set PublisherPublicKey digest
-     * @param digest a fake 32-bit digest is supported
-     */
-    void
-    SetPublisherPublicKeyDigest (uint32_t digest);
-
-    /**
-     * @brief Get PublisherPublicKey digest
-     */
-    uint32_t
-    GetPublisherPublicKeyDigest () const;
-
-    /**
-     * @brief Set content object timestamp
-     * @param timestamp timestamp
-     */
-    void
-    SetTimestamp (const Time &timestamp);
-
-    /**
-     * @brief Get timestamp of the content object
-     */
-    Time
-    GetTimestamp () const;
-
-    /**
-     * @brief Set ContentObject type
-     * @param type type of the content object
-     */
-    void
-    SetContentType (ContentType type);
-
-    /**
-     * @brief Get ContentObject type
-     */
-    ContentType
-    GetContentType () const;
-    
-    /**
-     * @brief Set freshness of the content object
-     * @param freshness Freshness, 0s means infinity
-     */
-    void
-    SetFreshness (const Time &freshness);
-
-    /**
-     * @brief Get freshness of the content object
-     */
-    Time
-    GetFreshness () const;
-
-    /**
-     * @brief Set key locator
-     * @param keyLocator name of the key
-     *
-     * Note that only <KeyName> option for the key locator is supported
-     */
-    void
-    SetKeyLocator (Ptr<const NameComponents> keyLocator);
-
-    /**
-     * @brief Get key locator
-     *
-     * Note that only <KeyName> option for the key locator is supported
-     */
-    Ptr<const NameComponents>
-    GetKeyLocator () const;
-    
-  private:
-    uint32_t m_publisherPublicKeyDigest; // fake publisher key digest
-    Time m_timestamp;
-    ContentType m_type;
-    Time m_freshness;
-    // FinalBlockID
-    Ptr<const NameComponents> m_keyLocator; // support only <KeyName> option for KeyLocator
-  };
-
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-
   /**
    * Constructor
    *
@@ -249,28 +87,30 @@
   GetNamePtr () const;
 
   /**
-   * @brief Get editable reference to content object's Signature
+   * @brief Set content object timestamp
+   * @param timestamp timestamp
    */
-  inline Signature &
-  GetSignature ();
+  void
+  SetTimestamp (const Time &timestamp);
 
   /**
-   * @brief Get read-only reference to content object's Signature
+   * @brief Get timestamp of the content object
    */
-  inline const Signature &
-  GetSignature () const;
+  Time
+  GetTimestamp () const;
+    
+  /**
+   * @brief Set freshness of the content object
+   * @param freshness Freshness, 0s means infinity
+   */
+  void
+  SetFreshness (const Time &freshness);
 
   /**
-   * @brief Get editable reference to content object's SignedInfo
+   * @brief Get freshness of the content object
    */
-  inline SignedInfo &
-  GetSignedInfo ();
-
-  /**
-   * @brief Get read-only reference to content object's SignedInfo
-   */
-  inline const SignedInfo &
-  GetSignedInfo () const;
+  Time
+  GetFreshness () const;
   
   //////////////////////////////////////////////////////////////////
   
@@ -282,14 +122,13 @@
   virtual uint32_t Deserialize (Buffer::Iterator start); ///< @brief Deserialize the Header
   
 private:
-  Signature  m_signature;
   Ptr<NameComponents> m_name;
-  SignedInfo m_signedInfo;
+  Time m_freshness;
+  Time m_timestamp;
 };
 
 /**
- * ContentObjectTail should always be 2 bytes, representing two closing tags:
- * "</Content><ContentObject>"
+ * ContentObjectTail for compatibility with other packet formats
  */
 class ContentObjectTail : public Trailer
 {
@@ -306,61 +145,6 @@
 };
 
 
-ContentObjectHeader::Signature::Signature ()
-  : m_digestAlgorithm ("99.0")
-  , m_signatureBits (0)
-{
-}
-
-const std::string &
-ContentObjectHeader::Signature::GetDigestAlgorithm () const
-{
-  return m_digestAlgorithm;
-}
-
-void
-ContentObjectHeader::Signature::SetDigestAlgorithm (const std::string &digestAlgorithm)
-{
-  m_digestAlgorithm = digestAlgorithm;
-}
-
-uint32_t
-ContentObjectHeader::Signature::GetSignatureBits () const
-{
-  return m_signatureBits;
-}
-
-inline void
-ContentObjectHeader::Signature::SetSignatureBits (uint32_t signature)
-{
-  m_signatureBits = signature;
-}
-
-
-ContentObjectHeader::Signature &
-ContentObjectHeader::GetSignature ()
-{
-  return m_signature;
-}
-
-const ContentObjectHeader::Signature &
-ContentObjectHeader::GetSignature () const
-{
-  return m_signature;
-}
-
-ContentObjectHeader::SignedInfo &
-ContentObjectHeader::GetSignedInfo ()
-{
-  return m_signedInfo;
-}
-
-const ContentObjectHeader::SignedInfo &
-ContentObjectHeader::GetSignedInfo () const
-{
-  return m_signedInfo;
-}
-
 /**
  * @ingroup ndn-exceptions
  * @brief Class for ContentObject parsing exception 
diff --git a/model/ndn-interest-header.cc b/model/ndn-interest-header.cc
index d0ebaab..f128821 100644
--- a/model/ndn-interest-header.cc
+++ b/model/ndn-interest-header.cc
@@ -15,21 +15,14 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
-///< #CCN_PR_SCOPE0 (0x20) local scope,
-///< #CCN_PR_SCOPE1 (0x40) this host,
-///< #CCN_PR_SCOPE2 (0x80) immediate neighborhood
-
 #include "ndn-interest-header.h"
 
 #include "ns3/log.h"
 #include "ns3/unused.h"
 #include "ns3/packet.h"
-#include "../helper/ndn-encoding-helper.h"
-#include "../helper/ndn-decoding-helper.h"
 
 NS_LOG_COMPONENT_DEFINE ("ndn.InterestHeader");
 
@@ -52,12 +45,7 @@
 
 InterestHeader::InterestHeader ()
   : m_name ()
-  , m_minSuffixComponents (-1)
-  , m_maxSuffixComponents (-1)
-  , m_exclude ()
-  , m_childSelector (false)
-  , m_answerOriginKind (false)
-  , m_scope (-1)
+  , m_scope (0xFF)
   , m_interestLifetime (Seconds (0))
   , m_nonce (0)
   , m_nackType (NORMAL_INTEREST)
@@ -66,11 +54,6 @@
 
 InterestHeader::InterestHeader (const InterestHeader &interest)
   : m_name                (Create<NameComponents> (interest.GetName ()))
-  , m_minSuffixComponents (interest.m_minSuffixComponents)
-  , m_maxSuffixComponents (interest.m_maxSuffixComponents)
-  , m_exclude             (interest.IsEnabledExclude () ? Create<NameComponents> (interest.GetExclude ()) : 0)
-  , m_childSelector       (interest.m_childSelector)
-  , m_answerOriginKind    (interest.m_answerOriginKind)
   , m_scope               (interest.m_scope)
   , m_interestLifetime    (interest.m_interestLifetime)
   , m_nonce               (interest.m_nonce)
@@ -107,73 +90,6 @@
 }
 
 void
-InterestHeader::SetMinSuffixComponents (int32_t value)
-{
-  m_minSuffixComponents = value;
-}
-
-int32_t
-InterestHeader::GetMinSuffixComponents () const
-{
-  return m_minSuffixComponents;
-}
-
-void
-InterestHeader::SetMaxSuffixComponents (int32_t value)
-{
-  m_maxSuffixComponents = value;
-}
-
-int32_t
-InterestHeader::GetMaxSuffixComponents () const
-{
-  return m_maxSuffixComponents;
-}
-
-void
-InterestHeader::SetExclude (Ptr<NameComponents> exclude)
-{
-  m_exclude = exclude;
-}
-
-bool
-InterestHeader::IsEnabledExclude () const
-{
-  return m_exclude!=0;
-}
-
-const NameComponents&
-InterestHeader::GetExclude () const
-{
-  if (m_exclude==0) throw InterestHeaderException();
-  return *m_exclude;
-}
-
-void
-InterestHeader::SetChildSelector (bool value)
-{
-  m_childSelector = value;
-}
-
-bool
-InterestHeader::IsEnabledChildSelector () const
-{
-  return m_childSelector;
-}
-
-void
-InterestHeader::SetAnswerOriginKind (bool value)
-{
-  m_answerOriginKind = value;
-}
-
-bool
-InterestHeader::IsEnabledAnswerOriginKind () const
-{
-  return m_answerOriginKind;
-}
-
-void
 InterestHeader::SetScope (int8_t scope)
 {
   m_scope = scope;
@@ -210,12 +126,12 @@
 }
 
 void
-InterestHeader::SetNack (uint32_t nackType)
+InterestHeader::SetNack (uint8_t nackType)
 {
   m_nackType = nackType;
 }
 
-uint32_t
+uint8_t
 InterestHeader::GetNack () const
 {
   return m_nackType;
@@ -224,22 +140,61 @@
 uint32_t
 InterestHeader::GetSerializedSize (void) const
 {
-  // unfortunately, we don't know exact header size in advance
-  return EncodingHelper::GetSerializedSize (*this);
+  size_t size = 2 + (1 + 4 + 2 + 1 + (m_name->GetSerializedSize ()) + (2 + 0) + (2 + 0));
+  NS_LOG_INFO ("Serialize size = " << size);
+
+  return size;
 }
     
 void
 InterestHeader::Serialize (Buffer::Iterator start) const
 {
-  size_t size = EncodingHelper::Serialize (start, *this);
-  NS_UNUSED (size);
-  NS_LOG_INFO ("Serialize size = " << size);
+  start.WriteU8 (0x80); // version
+  start.WriteU8 (0x00); // packet type
+
+  start.WriteU32 (m_nonce);
+  start.WriteU8 (m_scope);
+  start.WriteU8 (m_nackType);
+
+  NS_ASSERT_MSG (0 <= m_interestLifetime.ToInteger (Time::S) && m_interestLifetime.ToInteger (Time::S) < 65535,
+                 "Incorrect InterestLifetime (should not be smaller than 0 and larger than 65535");
+  
+  // rounding timestamp value to seconds
+  start.WriteU16 (static_cast<uint16_t> (m_interestLifetime.ToInteger (Time::S)));
+
+  uint32_t offset = m_name->Serialize (start);
+  start.Next (offset);
+  
+  start.WriteU16 (0); // no selectors
+  start.WriteU16 (0); // no options
 }
 
 uint32_t
 InterestHeader::Deserialize (Buffer::Iterator start)
 {
-  return DecodingHelper::Deserialize (start, *this); // \todo Debugging is necessary
+  Buffer::Iterator i = start;
+  
+  if (i.ReadU8 () != 0x80)
+    throw new InterestHeaderException ();
+
+  if (i.ReadU8 () != 0x00)
+    throw new InterestHeaderException ();
+
+  m_scope = i.ReadU8 ();
+  m_nackType = i.ReadU8 ();
+  m_interestLifetime = Seconds (i.ReadU16 ());
+
+  m_name = Create<NameComponents> ();
+  uint32_t offset = m_name->Deserialize (start);
+  i.Next (offset);
+  
+  i.ReadU16 ();
+  i.ReadU16 ();
+
+  NS_ASSERT (GetSerializedSize () == (i.GetDistanceFrom (start)));
+
+  return i.GetDistanceFrom (start);
+  // return DecodingHelper::Deserialize (start, *this); // \todo Debugging is necessary
 }
 
 TypeId
@@ -272,18 +227,7 @@
         }
       os << "</NACK>\n";
     }
-  if (GetMinSuffixComponents () >= 0)
-    os << "  <MinSuffixComponents>" << GetMinSuffixComponents () << "</MinSuffixComponents>\n";
-  if (GetMaxSuffixComponents () >= 0)
-    os << "  <MaxSuffixComponents>" << m_maxSuffixComponents << "</MaxSuffixComponents>\n";
-  if (IsEnabledExclude () && GetExclude ().size()>0)
-    os << "  <Exclude>" << GetExclude () << "</Exclude>\n";
-  if (IsEnabledChildSelector ())
-    os << "  <ChildSelector />\n";
-  if (IsEnabledAnswerOriginKind ())
-    os << "  <AnswerOriginKind />\n";
-  if (GetScope () >= 0)
-    os << "  <Scope>" << GetScope () << "</Scope>\n";
+  os << "  <Scope>" << GetScope () << "</Scope>\n";
   if ( !GetInterestLifetime ().IsZero() )
     os << "  <InterestLifetime>" << GetInterestLifetime () << "</InterestLifetime>\n";
   if (GetNonce ()>0)
diff --git a/model/ndn-interest-header.h b/model/ndn-interest-header.h
index f645255..096dc7b 100644
--- a/model/ndn-interest-header.h
+++ b/model/ndn-interest-header.h
@@ -38,97 +38,51 @@
 class Packet;
 
 namespace ndn {
-  
-/**
- * Ndn XML definition of Interest
- * 
- * Only few important fields are actually implemented in the simulation
- *
- * <xs:element name="Interest" type="InterestType"/>
- * <xs:complexType name="InterestType">
- *   <xs:sequence>
- *     <xs:element name="Name" type="NameType"/>
- *     <xs:element name="MinSuffixComponents" type="xs:nonNegativeInteger"
- *                         minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="MaxSuffixComponents" type="xs:nonNegativeInteger"
- *                         minOccurs="0" maxOccurs="1"/>
- *     <xs:choice minOccurs="0" maxOccurs="1">
- *         <xs:element name="PublisherPublicKeyDigest" type="DigestType"/>
- *         <xs:element name="PublisherCertificateDigest" type="DigestType"/>
- *         <xs:element name="PublisherIssuerKeyDigest" type="DigestType"/>
- *         <xs:element name="PublisherIssuerCertificateDigest" type="DigestType"/>
- *     </xs:choice>
- *     <xs:element name="Exclude" type="ExcludeType"
- *                         minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="ChildSelector" type="xs:nonNegativeInteger"
- *                         minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="AnswerOriginKind" type="xs:nonNegativeInteger"
- *                         minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="Scope" type="xs:nonNegativeInteger"
- * 			minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="InterestLifetime" type="FinegrainLifetimeType"
- * 			minOccurs="0" maxOccurs="1"/>
- *     <xs:element name="Nonce" type="Base64BinaryType"
- * 			minOccurs="0" maxOccurs="1"/>
- *   </xs:sequence>
- * </xs:complexType>
- *
- * <xs:complexType name="NameType">
- *   <xs:sequence>
- *     <xs:element name="Component" type="Base64BinaryType"
- *                 minOccurs="0" maxOccurs="unbounded"/>
- *   </xs:sequence>
- * </xs:complexType>
- * 
- * <xs:complexType name="ExcludeType">
- *   <xs:sequence>
- *     <xs:choice minOccurs="0" maxOccurs="1">
- *         <xs:element name="Any" type="EmptyType"/>
- *         <xs:element name="Bloom" type="Base64BinaryType"/> <!-- Bloom is deprecated --!>
- *     </xs:choice>
- *      <xs:sequence minOccurs="0" maxOccurs="unbounded">
- *         <xs:element name="Component" type="Base64BinaryType"/>
- *         <xs:choice minOccurs="0" maxOccurs="1">
- *             <xs:element name="Any" type="EmptyType"/>
- *             <xs:element name="Bloom" type="Base64BinaryType"/> <!-- Bloom is deprecated --!>
- *         </xs:choice>
- *      </xs:sequence>
- *   </xs:sequence>
- * </xs:complexType>
- * 
- * <!-- Binary representation of time, Unix time epoch, units 2**-12 sec (0.000244140625 sec) -->
- * <!-- The length limit limit of 6 bytes is not actually to be enforced, but
- *      it will be a loooooooong time before anyone cares. --> 
- * 
- * <!-- Binary representation of relative time, relative to "now" -->
- * <xs:complexType name="FinegrainLifetimeType">
- *   <xs:simpleContent>
- *     <xs:extension base="BinaryTime12">
- *       <xs:attribute name="ccnbencoding" type="xs:string" fixed="base64Binary"/>
- *     </xs:extension>
- *   </xs:simpleContent>
- * </xs:complexType>
- *
- * <xs:simpleType name="BinaryTime12">
- *     <xs:restriction base="xs:base64Binary">
- *       <xs:length value="6" fixed="true"/>
- *     </xs:restriction>
- * </xs:simpleType>
- *
- **/
 
 /**
   * @brief NDN InterestHeader and routines to serialize/deserialize
   *
-  * Simplifications:
-  * - Name:  binary name components are not supported
-  * - MinSuffixComponents and MasSuffixComponents: if value is negative (default), will not be serialized
-  * - ChildSelector, AnswerOriginKind: 0 - false, 1 - true, -1 not set
-  * - Publisher* elements are not supported
-  * - Exclude: only simple name matching is supported (Bloom support has been deprecated in Ndn)
-  * - InterestLifetime: ?
-  * - Nonce: 32 bit random integer.  If value is 0, will not be serialized
-  **/
+  * Optimized and simplified formatting of Interest packets 
+  *
+  *	Interest ::= Nonce 
+  *	     	     Scope 
+  *		     InterestLifetime 
+  *	     	     Name 
+  *	     	     Selectors 
+  *	     	     Options
+  *
+  * Minumum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 0) + (2 + 0) + (2 + 0) = 14
+  *
+  * Maximum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 65535) + (2 + 65535) + (2 + 65535) = 196619
+  *
+  * ::
+  *
+  *        0                   1                   2                   3
+  *        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  *        |                          Nonce                                |
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  *        |     Scope     |   Reserved    |      InterestLifetime         |
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  *        |            Length             |                               |
+  *	   |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+  *        ~                                                               ~
+  *        ~                            Name                               ~
+  *        |							           |	
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  *        |            Length             |                               |
+  *        |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+  *        ~                                                               ~
+  *        ~                          Selectors                            ~
+  *        |							            |	
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  *        |            Length             |                               |
+  *	   |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
+  *        ~                                                               ~
+  *        ~                          Options                              ~
+  *        |							           |	
+  *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  * **/
 class InterestHeader : public SimpleRefCount<InterestHeader, Header>
 {
 public:
@@ -153,7 +107,6 @@
   void
   SetName (Ptr<NameComponents> name);
 
-
   /**
    * \brief Get interest name
    *
@@ -169,105 +122,6 @@
   GetNamePtr () const;
 
   /**
-   * \brief Set interest MinSuffixComponents
-   *
-   * MinSuffixComponents refer to the number of name components beyond those in the prefix, 
-   * and counting the implicit digest, that may occur in the matching ContentObject.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   * @param[in] value minimum length of suffix components
-   **/
-  void
-  SetMinSuffixComponents (int32_t value);
-
-  /**
-   * \brief Get interest MinSuffixComponents
-   *
-   * MinSuffixComponents refer to the number of name components beyond those in the prefix, 
-   * and counting the implicit digest, that may occur in the matching ContentObject.
-   * For more information, see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html
-   **/
-  int32_t
-  GetMinSuffixComponents () const;
-
-
-  /**
-   * \brief Set interest MaxSuffixComponents
-   *
-   * MaxSuffixComponents refer to the number of name components beyond those in the prefix, 
-   * and counting the implicit digest, that may occur in the matching ContentObject.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   * @param[in] value maximum length of suffix components
-   **/
-  void
-  SetMaxSuffixComponents (int32_t value);
-
-  /**
-   * \brief Get interest MaxSuffixComponents
-   *
-   * MaxSuffixComponents refer to the number of name components beyond those in the prefix, 
-   * and counting the implicit digest, that may occur in the matching ContentObject.
-   * For more information, see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html
-   **/
-  int32_t
-  GetMaxSuffixComponents () const;
-
-  /**
-   * \brief Set exclude filer
-   *
-   * For example, SetExclude (ndnNameComponents("exclude1")("exclude2")("exclude3"))
-   * @param[in] exclude const pointer to ndnNameComponents to be excluded 
-   **/
-  void
-  SetExclude (Ptr<NameComponents> exclude);
-
-  /**
-   * \brief Check if interest conatins exclude filter
-   *
-   */ 
-  bool
-  IsEnabledExclude () const;
-  
-  /**
-   * \brief Get exclude filter 
-   */
-  const NameComponents&
-  GetExclude () const;
-
-  /**
-   * \brief Set ChildSelector
-   * Often a given interest will match more than one ContentObject within a given content store. 
-   * The ChildSelector provides a way of expressing a preference for which of these should be returned. 
-   * If the value is false, the leftmost child is preferred. If true, the rightmost child is preferred.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information. 
-   * @param[in] value boolean ChildSelector value
-   */
-  void
-  SetChildSelector (bool value);
-
-  /**
-   * \brief Return ChildSelector value
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   *
-   */
-  bool
-  IsEnabledChildSelector () const;
-
-  /**
-   * \brief Set AnswerOriginKind
-   * Default value for AnswerOriginKind is false.
-   * @param[in] value boolean AnswerOriginKind value
-   */
-  void
-  SetAnswerOriginKind (bool value);
-
-  /**
-   * \brief Check the value of AnswerOriginKind
-   *
-   */
-  bool
-  IsEnabledAnswerOriginKind () const;
-
-  /**
    * \brief Set Scope
    * Scope limits where the Interest may propagate. 
    * Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host).
@@ -348,14 +202,14 @@
    * @param[in] nackType  NACK_LOOP or NACK_CONGESTION or NACK_GIVEUP_PIT or NORMAL_INTEREST
    */
   void
-  SetNack (uint32_t nackType);
+  SetNack (uint8_t nackType); //using reserved field
     
   /**
   * \brief Get NACK type
   * Returns NACK_LOOP, NACK_CONGESTION or NACK_GIVEUP_PIT. 
   * Otherwise, in case of normal interest packet, returns NORMAL_INTEREST (equals 0).
   */
-  uint32_t
+  uint8_t
   GetNack () const;
 
   //////////////////////////////////////////////////////////////////
@@ -396,15 +250,10 @@
   
 private:
   Ptr<NameComponents> m_name;    ///< Interest name
-  int32_t m_minSuffixComponents; ///< Minimum suffix components. not used if negative
-  int32_t m_maxSuffixComponents; ///< Maximum suffix components. not used if negative
-  Ptr<NameComponents> m_exclude; ///< Exclude filter
-  bool m_childSelector;          ///< Default value for ChildSelector is false
-  bool m_answerOriginKind;       ///< Default value for AnswerOriginKind is false
-  int8_t m_scope;                ///< -1 not set, 0 local scope, 1 this host, 2 immediate neighborhood
+  uint8_t m_scope;                ///< 0xFF not set, 0 local scope, 1 this host, 2 immediate neighborhood
   Time  m_interestLifetime;      ///< InterestLifetime
   uint32_t m_nonce;              ///< Nonce. not used if zero
-  uint32_t m_nackType;           ///< Negative Acknowledgement type
+  uint8_t  m_nackType;           ///< Negative Acknowledgement type
 };
 
 /**
diff --git a/model/ndn-name-components.cc b/model/ndn-name-components.cc
index d5ac498..6e44b12 100644
--- a/model/ndn-name-components.cc
+++ b/model/ndn-name-components.cc
@@ -105,6 +105,59 @@
   return retval;
 }
 
+size_t
+NameComponents::GetSerializedSize () const
+{
+  size_t nameSerializedSize = 2;
+  for (std::list<std::string>::const_iterator i = this->begin ();
+       i != this->end ();
+       i++)
+    {
+      nameSerializedSize += 2 + i->size ();
+    }
+  NS_ASSERT_MSG (nameSerializedSize < 30000, "Name is too long (> 30kbytes)");
+
+  return nameSerializedSize;
+}
+
+uint32_t
+NameComponents::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+
+  i.WriteU16 (static_cast<uint16_t> (this->GetSerializedSize ()-2));
+
+  for (std::list<std::string>::const_iterator item = this->begin ();
+       item != this->end ();
+       item++)
+    {
+      i.WriteU16 (static_cast<uint16_t> (item->size ()));
+      i.Write (reinterpret_cast<const uint8_t*> (item->c_str ()), item->size ());
+    }
+
+  return i.GetDistanceFrom (start);
+}
+  
+uint32_t
+NameComponents::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+    
+  uint16_t nameLength = i.ReadU16 ();
+  while (nameLength > 0)
+    {
+      uint16_t length = i.ReadU16 ();
+      nameLength = nameLength - 2 - length;
+
+      uint8_t tmp[length];
+      i.Read (tmp, length);
+
+      this->Add (string (reinterpret_cast<const char*> (tmp), length));
+    }
+
+  return i.GetDistanceFrom (start);
+}
+
 void
 NameComponents::Print (std::ostream &os) const
 {
diff --git a/model/ndn-name-components.h b/model/ndn-name-components.h
index 4a479ac..c2076d1 100644
--- a/model/ndn-name-components.h
+++ b/model/ndn-name-components.h
@@ -30,6 +30,7 @@
 #include <algorithm>
 #include <list>
 #include "ns3/object.h"
+#include "ns3/buffer.h"
 
 #include <boost/ref.hpp>
 
@@ -128,6 +129,26 @@
   void Print (std::ostream &os) const;
 
   /**
+   * @brief Get serialized size for ndnSIM packet encoding
+   */
+  size_t
+  GetSerializedSize () const;
+  
+  /**
+   * @brief Serialize Name in ndnSIM packet encoding
+   * @param[in] start buffer to contain serialized name 
+   */
+  uint32_t
+  Serialize (Buffer::Iterator start) const;
+  
+  /**
+   * \brief Deserialize Name in ndnSIM packet encoding
+   * @param[in] start buffer that contains serialized name
+   */ 
+  uint32_t
+  Deserialize (Buffer::Iterator start);
+  
+  /**
    * \brief Returns the size of NameComponents
    */
   inline size_t
