diff --git a/disabled/ccnb-parser/visitors/interest-visitor.cc b/disabled/ccnb-parser/visitors/interest-visitor.cc
deleted file mode 100644
index 4e7b8ca..0000000
--- a/disabled/ccnb-parser/visitors/interest-visitor.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "interest-visitor.h"
-
-#include "../syntax-tree/block.h"
-#include "../syntax-tree/dtag.h"
-
-#include "ns3/ndn-name.h"
-#include "ns3/ndn-interest-header.h"
-
-#include "ns3/assert.h"
-#include "ns3/nstime.h"
-
-#include "name-components-visitor.h"
-#include "non-negative-integer-visitor.h"
-#include "timestamp-visitor.h"
-#include "uint32t-blob-visitor.h"
-
-#include <boost/foreach.hpp>
-
-#include "ns3/log.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.CcnbParser.InterestVisitor");
-
-namespace ns3 {
-namespace ndn {
-namespace CcnbParser {
-
-// We don't care about any other fields
-void
-InterestVisitor::visit (Dtag &n, boost::any param/*should be Interest* */)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-
-  static NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
-  static NameVisitor     nameComponentsVisitor;
-  static TimestampVisitor          timestampVisitor;
-  static Uint32tBlobVisitor        nonceVisitor;
-  
-  Interest &interest = *(boost::any_cast<Interest*> (param));
-
-  switch (n.m_dtag)
-    {
-    case CCN_DTAG_Interest:
-      NS_LOG_DEBUG ("Interest");
-  
-      // process nested blocks
-      BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-        {
-          block->accept (*this, param);
-        }
-      break;
-    case CCN_DTAG_Name:
-      {
-        NS_LOG_DEBUG ("Name");
-
-        // process name components
-        Ptr<Name> name = Create<Name> ();
-        
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (nameComponentsVisitor, &(*name));
-          }
-        interest.SetName (name);
-        break;
-      }
-    case CCN_DTAG_MinSuffixComponents:
-      NS_LOG_DEBUG ("MinSuffixComponents");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-      interest.SetMinSuffixComponents (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CCN_DTAG_MaxSuffixComponents:
-      NS_LOG_DEBUG ("MaxSuffixComponents");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-      interest.SetMaxSuffixComponents (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CCN_DTAG_Exclude:
-      {
-        NS_LOG_DEBUG ("Exclude");
-        // process exclude components
-        Ptr<Name> exclude = Create<Name> ();
-        
-        BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-          {
-            block->accept (nameComponentsVisitor, &(*exclude));
-          }
-        interest.SetExclude (exclude);
-        break;
-      }
-    case CCN_DTAG_ChildSelector:
-      NS_LOG_DEBUG ("ChildSelector");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-
-      interest.SetChildSelector (
-               1 == boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CCN_DTAG_AnswerOriginKind:
-      NS_LOG_DEBUG ("AnswerOriginKind");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-      interest.SetAnswerOriginKind (
-               1 == boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CCN_DTAG_Scope: 
-      NS_LOG_DEBUG ("Scope");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-      interest.SetScope (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CCN_DTAG_InterestLifetime:
-      NS_LOG_DEBUG ("InterestLifetime");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-
-      interest.SetInterestLifetime (
-               boost::any_cast<Time> (
-                                      (*n.m_nestedTags.begin())->accept(
-                                                                        timestampVisitor
-                                                                        )));
-      break;
-    case CCN_DTAG_Nonce:
-      NS_LOG_DEBUG ("Nonce");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-
-      interest.SetNonce (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonceVisitor
-                                                                           )));
-      break;
-    
-            
-    case CCN_DTAG_Nack:
-      NS_LOG_DEBUG ("Nack");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-            
-      interest.SetNack (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(nonNegativeIntegerVisitor)));
-      break;
-    }
-}
-
-} // namespace CcnbParser
-} // namespace ndn
-} // namespace ns3
diff --git a/disabled/ccnb-parser/visitors/interest-visitor.h b/disabled/ccnb-parser/visitors/interest-visitor.h
deleted file mode 100644
index 38a969d..0000000
--- a/disabled/ccnb-parser/visitors/interest-visitor.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_INTEREST_VISITOR_H_
-#define _CCNB_PARSER_INTEREST_VISITOR_H_
-
-#include "void-depth-first-visitor.h"
-
-namespace ns3 {
-namespace ndn {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor that fills fields in CcnxInterest
- *
- * Usage example:
- * \code
- *   Ptr<CcnxInterest> header = Create<CcnxInterest> ();
- *   Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
- *   InterestVisitor visitor;
- *   root->accept (visitor, *header); 
- * \endcode
- */
-class InterestVisitor : public VoidDepthFirstVisitor
-{
-public:
-  virtual void visit (Dtag &n, boost::any param/*should be CcnxInterest* */);
-};
-
-} // namespace CcnbParser
-} // namespace ndn
-} // namespace ns3
-
-#endif // _CCNB_PARSER_INTEREST_VISITOR_H_
diff --git a/disabled/ndn-content-object-header-ccnb.cc b/disabled/ndn-content-object-header-ccnb.cc
deleted file mode 100644
index 1f1a9f3..0000000
--- a/disabled/ndn-content-object-header-ccnb.cc
+++ /dev/null
@@ -1,555 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * 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>
- */
-
-#include "ndn-content-object-header-ccnb.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>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.ContentObject");
-
-namespace ns3 {
-namespace ndn {
-
-using namespace CcnbParser;
-
-const std::string ContentObject::Signature::DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
-
-NS_OBJECT_ENSURE_REGISTERED (ContentObject);
-NS_OBJECT_ENSURE_REGISTERED (ContentObjectTail);
-
-TypeId
-ContentObject::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::ContentObject")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<ContentObject> ()
-    ;
-  return tid;
-}
-
-ContentObject::ContentObject ()
-{
-}
-
-void
-ContentObject::SetName (const Ptr<Name> &name)
-{
-  m_name = name;
-}
-
-const Name&
-ContentObject::GetName () const
-{
-  if (m_name==0) throw ContentObjectException();
-  return *m_name;
-}
-
-Ptr<const Name>
-ContentObject::GetNamePtr () const
-{
-  return m_name;
-}
-
-#define CCNB EncodingHelper // just to simplify writing
-
-void
-ContentObject::Serialize (Buffer::Iterator start) const
-{
-  size_t written = 0;
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_ContentObject, CCN_DTAG); // <ContentObject>
-
-  // 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>  
-
-  written += CCNB::AppendBlockHeader (start, CCN_DTAG_Name, CCN_DTAG);    // <Name>
-  written += CCNB::AppendName (start, GetName()); //   <Component>...</Component>...
-  written += CCNB::AppendCloser (start);                                  // </Name>  
-
-  // 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);
-
-  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::AppendName (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
-}
-
-uint32_t
-ContentObject::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::EstimateName (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::EstimateName (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 ContentObject* */)
-  {
-    // uint32_t n.m_dtag;
-    // std::list<Ptr<Block> > n.m_nestedBlocks;
-    static NameVisitor nameComponentsVisitor;
-    static NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
-    static TimestampVisitor          timestampVisitor;
-    static StringVisitor     stringVisitor;
-    static Uint32tBlobVisitor uint32tBlobVisitor;
-    static ContentTypeVisitor contentTypeVisitor;
-  
-    ContentObject &contentObject = *(boost::any_cast<ContentObject*> (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<Name> name = Create<Name> ();
-        
-          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<ContentObject::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<Name> name = Create<Name> ();
-        
-          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
-ContentObject::Deserialize (Buffer::Iterator start)
-{
-  static ContentObjectVisitor contentObjectVisitor;
-
-  Buffer::Iterator i = start;
-  Ptr<Block> root = Block::ParseBlock (i);
-  root->accept (contentObjectVisitor, this);
-
-  return i.GetDistanceFrom (start);
-}
-  
-TypeId
-ContentObject::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-  
-void
-ContentObject::Print (std::ostream &os) const
-{
-  os << "D: " << GetName ();
-  // os << "<ContentObject><Name>" << GetName () << "</Name><Content>";
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-ContentObjectTail::ContentObjectTail ()
-{
-}
-
-TypeId
-ContentObjectTail::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::ContentObjectTail")
-    .SetParent<Trailer> ()
-    .AddConstructor<ContentObjectTail> ()
-    ;
-  return tid;
-}
-
-TypeId
-ContentObjectTail::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-void
-ContentObjectTail::Print (std::ostream &os) const
-{
-  os << "</Content></ContentObject>";
-}
-
-uint32_t
-ContentObjectTail::GetSerializedSize (void) const
-{
-  return 2;
-}
-
-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;
-}
-
-///////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////
-
-ContentObject::SignedInfo::SignedInfo ()
-  : m_publisherPublicKeyDigest (0)
-  // ,  m_timestamp
-  , m_type (DATA)
-  // , m_freshness
-  // , FinalBlockID
-  // , KeyLocator
-{
-}
-
-void
-ContentObject::SignedInfo::SetPublisherPublicKeyDigest (uint32_t digest)
-{
-  m_publisherPublicKeyDigest = digest;
-}
-
-uint32_t
-ContentObject::SignedInfo::GetPublisherPublicKeyDigest () const
-{
-  return m_publisherPublicKeyDigest;
-}
-
-void
-ContentObject::SignedInfo::SetTimestamp (const Time &timestamp)
-{
-  m_timestamp = timestamp;
-}
-
-Time
-ContentObject::SignedInfo::GetTimestamp () const
-{
-  return m_timestamp;
-}
-
-void
-ContentObject::SignedInfo::SetContentType (ContentObject::ContentType type)
-{
-  m_type = type;
-}
-
-ContentObject::ContentType
-ContentObject::SignedInfo::GetContentType () const
-{
-  return m_type;
-}
-
-void
-ContentObject::SignedInfo::SetFreshness (const Time &freshness)
-{
-  m_freshness = freshness;
-}
-
-Time
-ContentObject::SignedInfo::GetFreshness () const
-{
-  return m_freshness;
-}
-
-void
-ContentObject::SignedInfo::SetKeyLocator (Ptr<const Name> keyLocator)
-{
-  m_keyLocator = keyLocator;
-}
-
-Ptr<const Name>
-ContentObject::SignedInfo::GetKeyLocator () const
-{
-  return m_keyLocator;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/disabled/ndn-content-object-header-ccnb.h b/disabled/ndn-content-object-header-ccnb.h
deleted file mode 100644
index 8d58a65..0000000
--- a/disabled/ndn-content-object-header-ccnb.h
+++ /dev/null
@@ -1,373 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * 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>
- */
-
-#ifndef _NDN_CONTENT_OBJECT_HEADER_CCNB_H_
-#define _NDN_CONTENT_OBJECT_HEADER_CCNB_H_
-
-#include "ns3/integer.h"
-#include "ns3/header.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/trailer.h"
-#include "ns3/nstime.h"
-
-#include <string>
-#include <vector>
-#include <list>
-
-#include "ndn-name.h"
-
-namespace ns3 {
-namespace ndn {
-
-/**
- * Ndn XML definition of ContentObject
- * 
- * Only few important fields are actually implemented in the simulation
- *
- *
- * 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)
- *
- * "<ContentObject><Signature>..</Signature><Name>...</Name><SignedInfo>...</SignedInfo><Content>"
- * 
- */
-class ContentObject : public SimpleRefCount<ContentObject,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 Name> keyLocator);
-
-    /**
-     * @brief Get key locator
-     *
-     * Note that only <KeyName> option for the key locator is supported
-     */
-    Ptr<const Name>
-    GetKeyLocator () const;
-    
-  private:
-    uint32_t m_publisherPublicKeyDigest; // fake publisher key digest
-    Time m_timestamp;
-    ContentType m_type;
-    Time m_freshness;
-    // FinalBlockID
-    Ptr<const Name> m_keyLocator; // support only <KeyName> option for KeyLocator
-  };
-
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-  ////////////////////////////////////////////////////////////////////////////  
-
-  /**
-   * Constructor
-   *
-   * Creates a null header
-   **/
-  ContentObject ();
-
-  /**
-   * \brief Set content object name
-   *
-   * Sets name of the content object. For example, SetName( Name("prefix")("postfix") );
-   **/
-  void
-  SetName (const Ptr<Name> &name);
-
-  /**
-   * @brief Get name of the content object
-   */
-  const Name&
-  GetName () const;
-
-  /**
-   * @brief Get smart pointer to the interest name (to avoid extra memory usage)
-   */
-  Ptr<const Name>
-  GetNamePtr () const;
-
-  /**
-   * @brief Get editable reference to content object's Signature
-   */
-  inline Signature &
-  GetSignature ();
-
-  /**
-   * @brief Get read-only reference to content object's Signature
-   */
-  inline const Signature &
-  GetSignature () const;
-
-  /**
-   * @brief Get editable reference to content object's SignedInfo
-   */
-  inline SignedInfo &
-  GetSignedInfo ();
-
-  /**
-   * @brief Get read-only reference to content object's SignedInfo
-   */
-  inline const SignedInfo &
-  GetSignedInfo () const;
-  
-  //////////////////////////////////////////////////////////////////
-  
-  static TypeId GetTypeId (void); ///< @brief Get TypeId
-  virtual TypeId GetInstanceTypeId (void) const; ///< @brief Get TypeId of the instance
-  virtual void Print (std::ostream &os) const; ///< @brief Print out information about the Header into the stream
-  virtual uint32_t GetSerializedSize (void) const; ///< @brief Get size necessary to serialize the Header
-  virtual void Serialize (Buffer::Iterator start) const; ///< @brief Serialize the Header
-  virtual uint32_t Deserialize (Buffer::Iterator start); ///< @brief Deserialize the Header
-  
-private:
-  Signature  m_signature;
-  Ptr<Name> m_name;
-  SignedInfo m_signedInfo;
-};
-
-/**
- * ContentObjectTail should always be 2 bytes, representing two closing tags:
- * "</Content><ContentObject>"
- */
-class ContentObjectTail : public Trailer
-{
-public:
-  ContentObjectTail ();
-  //////////////////////////////////////////////////////////////////
-  
-  static TypeId GetTypeId (void); ///< @brief Get TypeId
-  virtual TypeId GetInstanceTypeId (void) const; ///< @brief Get TypeId of the instance
-  virtual void Print (std::ostream &os) const; ///< @brief Print out information about Tail into the stream
-  virtual uint32_t GetSerializedSize (void) const; ///< @brief Get size necessary to serialize the Tail
-  virtual void Serialize (Buffer::Iterator start) const; ///< @brief Serialize the Tail
-  virtual uint32_t Deserialize (Buffer::Iterator start); ///< @brief Deserialize the Tail
-};
-
-
-ContentObject::Signature::Signature ()
-  : m_digestAlgorithm ("99.0")
-  , m_signatureBits (0)
-{
-}
-
-const std::string &
-ContentObject::Signature::GetDigestAlgorithm () const
-{
-  return m_digestAlgorithm;
-}
-
-void
-ContentObject::Signature::SetDigestAlgorithm (const std::string &digestAlgorithm)
-{
-  m_digestAlgorithm = digestAlgorithm;
-}
-
-uint32_t
-ContentObject::Signature::GetSignatureBits () const
-{
-  return m_signatureBits;
-}
-
-inline void
-ContentObject::Signature::SetSignatureBits (uint32_t signature)
-{
-  m_signatureBits = signature;
-}
-
-
-ContentObject::Signature &
-ContentObject::GetSignature ()
-{
-  return m_signature;
-}
-
-const ContentObject::Signature &
-ContentObject::GetSignature () const
-{
-  return m_signature;
-}
-
-ContentObject::SignedInfo &
-ContentObject::GetSignedInfo ()
-{
-  return m_signedInfo;
-}
-
-const ContentObject::SignedInfo &
-ContentObject::GetSignedInfo () const
-{
-  return m_signedInfo;
-}
-
-/**
- * @ingroup ndn-exceptions
- * @brief Class for ContentObject parsing exception 
- */
-class ContentObjectException {};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_CONTENT_OBJECT_HEADER_CCNB_H_
diff --git a/disabled/ndn-decoding-helper.cc b/disabled/ndn-decoding-helper.cc
deleted file mode 100644
index 3984540..0000000
--- a/disabled/ndn-decoding-helper.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-decoding-helper.h"
-
-#include "ns3/ndn-interest-header.h"
-
-#include "ccnb-parser/visitors/interest-visitor.h"
-
-#include "ccnb-parser/syntax-tree/block.h"
-#include "ccnb-parser/syntax-tree/dtag.h"
-
-#include "ns3/log.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.DecodingHelper");
-
-namespace ns3 {
-namespace ndn {
-
-size_t
-DecodingHelper::Deserialize (Buffer::Iterator start, Interest &interest)
-{
-  static CcnbParser::InterestVisitor interestVisitor;
-
-  Buffer::Iterator i = start;
-  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
-  root->accept (interestVisitor, &interest);
-  
-  return i.GetDistanceFrom (start);
-}
-
-// size_t
-// NdnDecodingHelper::Deserialize (Buffer::Iterator start, NdnContentObject &contentObject)
-// {
-//   static CcnbParser::ContentObjectVisitor contentObjectVisitor;
-
-//   Buffer::Iterator i = start;
-//   Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
-//   root->accept (contentObjectVisitor, &contentObject);
-
-//   return i.GetDistanceFrom (start);
-// }
-
-} // namespace ndn
-} // namespace ns3
diff --git a/disabled/ndn-decoding-helper.h b/disabled/ndn-decoding-helper.h
deleted file mode 100644
index 8a33be3..0000000
--- a/disabled/ndn-decoding-helper.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _NDN_DECODING_HELPER_H_
-#define _NDN_DECODING_HELPER_H_
-
-#include <cstring>
-#include "ns3/buffer.h"
-
-namespace ns3 {
-namespace ndn {
-
-class Interest;
-class ContentObject;
-
-typedef Interest InterestHeader;
-typedef ContentObject ContentObjectHeader;
-
-/**
- * \brief Helper class to decode ccnb formatted Ndn message
- */
-class DecodingHelper
-{
-public:
-  /**
-   * \brief Deserialize Buffer::Iterator to NdnInterest
-   * @param start Buffer containing serialized Ndn message
-   * @param interest Pointer to the NdnInterest to hold deserialized value
-   * @return Number of bytes used for deserialization
-   */
-  static size_t
-  Deserialize (Buffer::Iterator start, Interest &interest);
-
-  /**
-   * \brief Deserialize Buffer::Iterator to NdnContentObject
-   * @param start Buffer containing serialized Ndn message
-   * @param contentObject Pointer to the NdnContentObject to hold deserialized value
-   * @return Number of bytes used for deserialization
-   */
-  // static size_t
-  // Deserialize (Buffer::Iterator start, ContentObject &contentObject);
-};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_DECODING_HELPER_H_
diff --git a/disabled/ndn-encoding-helper.cc b/disabled/ndn-encoding-helper.cc
deleted file mode 100644
index 644ef7b..0000000
--- a/disabled/ndn-encoding-helper.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu> 
- */
-
-#include "ndn-encoding-helper.h"
-
-#include "ns3/ndn-name.h"
-#include "ns3/ndn-interest-header.h"
-#include "ns3/ndn-content-object-header.h"
-
-#include <sstream>
-#include <boost/foreach.hpp>
-
-namespace ns3 {
-namespace ndn {
-
-size_t
-EncodingHelper::Serialize (Buffer::Iterator start, const Interest &interest)
-{
-  size_t written = 0;
-  written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Interest, CcnbParser::CCN_DTAG); // <Interest>
-  
-  written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
-  written += AppendName (start, interest.GetName());                // <Component>...</Component>...
-  written += AppendCloser (start);                               // </Name>
-
-  if (interest.GetMinSuffixComponents() >= 0)
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_MinSuffixComponents, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, interest.GetMinSuffixComponents ());
-      written += AppendCloser (start);
-    }
-  if (interest.GetMaxSuffixComponents() >= 0)
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_MaxSuffixComponents, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, interest.GetMaxSuffixComponents ());
-      written += AppendCloser (start);
-    }
-  if (interest.IsEnabledExclude() && interest.GetExclude().size() > 0)
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Exclude, CcnbParser::CCN_DTAG); // <Exclude>
-      written += AppendName (start, interest.GetExclude());                // <Component>...</Component>...
-      written += AppendCloser (start);                                  // </Exclude>
-    }
-  if (interest.IsEnabledChildSelector())
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_ChildSelector, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, 1);
-      written += AppendCloser (start);
-    }
-  if (interest.IsEnabledAnswerOriginKind())
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_AnswerOriginKind, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, 1);
-      written += AppendCloser (start);
-    }
-  if (interest.GetScope() >= 0)
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Scope, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, interest.GetScope ());
-      written += AppendCloser (start);
-    }
-  if (!interest.GetInterestLifetime().IsZero())
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_InterestLifetime, CcnbParser::CCN_DTAG);
-      written += AppendTimestampBlob (start, interest.GetInterestLifetime ());
-      written += AppendCloser (start);
-    }
-  if (interest.GetNonce()>0)
-    {
-      uint32_t nonce = interest.GetNonce();
-      written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Nonce, nonce);
-    }
-    
-  if (interest.GetNack ()>0)
-    {
-      written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Nack, CcnbParser::CCN_DTAG);
-      written += AppendNumber (start, interest.GetNack ());
-      written += AppendCloser (start);
-    }
-  written += AppendCloser (start); // </Interest>
-
-  return written;
-}
-
-size_t
-EncodingHelper::GetSerializedSize (const Interest &interest)
-{
-  size_t written = 0;
-  written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Interest); // <Interest>
-  
-  written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
-  written += EstimateName (interest.GetName()); // <Component>...</Component>...
-  written += 1; // </Name>
-
-  if (interest.GetMinSuffixComponents() >= 0)
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_MinSuffixComponents);
-      written += EstimateNumber (interest.GetMinSuffixComponents ());
-      written += 1;
-    }
-  if (interest.GetMaxSuffixComponents() >= 0)
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_MaxSuffixComponents);
-      written += EstimateNumber (interest.GetMaxSuffixComponents ());
-      written += 1;
-    }
-  if (interest.IsEnabledExclude() && interest.GetExclude().size() > 0)
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Exclude);
-      written += EstimateName (interest.GetExclude());                // <Component>...</Component>...
-      written += 1;                                  // </Exclude>
-    }
-  if (interest.IsEnabledChildSelector())
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_ChildSelector);
-      written += EstimateNumber (1);
-      written += 1;
-    }
-  if (interest.IsEnabledAnswerOriginKind())
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_AnswerOriginKind);
-      written += EstimateNumber (1);
-      written += 1;
-    }
-  if (interest.GetScope() >= 0)
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Scope);
-      written += EstimateNumber (interest.GetScope ());
-      written += 1;
-    }
-  if (!interest.GetInterestLifetime().IsZero())
-    {
-      written += EstimateBlockHeader (CcnbParser::CCN_DTAG_InterestLifetime);
-      written += EstimateTimestampBlob (interest.GetInterestLifetime());
-      written += 1;
-    }
-  if (interest.GetNonce()>0)
-    {
-      written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Nonce, sizeof(uint32_t));
-    }
-  if (interest.GetNack ()>0)
-    {
-        written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Nack);
-        written += EstimateNumber (interest.GetNack ());
-        written += 1;
-    }
-
-  written += 1; // </Interest>
-
-  return written;
-}
-
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-
-#define CCN_TT_BITS 3
-#define CCN_TT_MASK ((1 << CCN_TT_BITS) - 1)
-#define CCN_MAX_TINY ((1 << (7-CCN_TT_BITS)) - 1)
-#define CCN_TT_HBIT ((unsigned char)(1 << 7))
-
-size_t
-EncodingHelper::AppendBlockHeader (Buffer::Iterator &start, size_t val, CcnbParser::ccn_tt tt)
-{
-  unsigned char buf[1+8*((sizeof(val)+6)/7)];
-  unsigned char *p = &(buf[sizeof(buf)-1]);
-  size_t n = 1;
-  p[0] = (CCN_TT_HBIT & ~CcnbParser::CCN_CLOSE) |
-  ((val & CCN_MAX_TINY) << CCN_TT_BITS) |
-  (CCN_TT_MASK & tt);
-  val >>= (7-CCN_TT_BITS);
-  while (val != 0) {
-    (--p)[0] = (((unsigned char)val) & ~CCN_TT_HBIT) | CcnbParser::CCN_CLOSE;
-    n++;
-    val >>= 7;
-  }
-  start.Write (p,n);
-  return n;
-}
-
-size_t
-EncodingHelper::EstimateBlockHeader (size_t value)
-{
-  value >>= (7-CCN_TT_BITS);
-  size_t n = 1;
-  while (value>0)
-    {
-      value >>= 7;
-      n++;
-    }
-  return n;
-}
-
-size_t
-EncodingHelper::AppendNumber (Buffer::Iterator &start, uint32_t number)
-{
-  std::ostringstream os;
-  os << number;
-
-  size_t written = 0;
-  written += AppendBlockHeader (start, os.str().size(), CcnbParser::CCN_UDATA);
-  written += os.str().size();
-  start.Write (reinterpret_cast<const unsigned char*>(os.str().c_str()), os.str().size());
-
-  return written;
-}
-
-size_t
-EncodingHelper::EstimateNumber (uint32_t number)
-{
-  std::ostringstream os;
-  os << number;
-  return EstimateBlockHeader (os.str ().size ()) + os.str ().size ();
-}
-  
-size_t
-EncodingHelper::AppendCloser (Buffer::Iterator &start)
-{
-  start.WriteU8 (CcnbParser::CCN_CLOSE);
-  return 1;
-}
-
-size_t
-EncodingHelper::AppendName (Buffer::Iterator &start, const Name &name)
-{
-  size_t written = 0;
-  BOOST_FOREACH (const std::string &component, name.GetComponents())
-    {
-      written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Component,
-                                   reinterpret_cast<const uint8_t*>(component.c_str()), component.size());
-    }
-  return written;
-}
-
-size_t
-EncodingHelper::EstimateName (const Name &name)
-{
-  size_t written = 0;
-  BOOST_FOREACH (const std::string &component, name.GetComponents())
-    {
-      written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Component, component.size());
-    }
-  return written;
-}
-
-size_t
-EncodingHelper::AppendTimestampBlob (Buffer::Iterator &start, const Time &time)
-{
-  // the original function implements Markers... thought not sure what are these markers for...
-
-  // Determine miminal number of bytes required to store the timestamp
-  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
-  intmax_t ts = time.ToInteger (Time::S) >> 4;
-  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
-     required_bytes++;
-  
-  size_t len = AppendBlockHeader(start, required_bytes, CcnbParser::CCN_BLOB);
-
-  // write part with seconds
-  ts = time.ToInteger (Time::S) >> 4;
-  for (int i = 0; i < required_bytes - 2; i++)
-    start.WriteU8 ( ts >> (8 * (required_bytes - 3 - i)) );
-
-  /* arithmetic contortions are to avoid overflowing 31 bits */
-  ts = ((time.ToInteger (Time::S) & 15) << 12) +
-       (((time.ToInteger (Time::NS) % 1000000000) / 5 * 8 + 195312) / 390625);
-  for (int i = required_bytes - 2; i < required_bytes; i++)
-    start.WriteU8 ( ts >> (8 * (required_bytes - 1 - i)) );
-  
-  return len + required_bytes;
-}
-
-size_t
-EncodingHelper::EstimateTimestampBlob (const Time &time)
-{
-  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
-  intmax_t ts = time.ToInteger (Time::S) >> 4;
-  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
-     required_bytes++;
-
-  return EstimateBlockHeader (required_bytes) + required_bytes;
-}
-
-size_t
-EncodingHelper::AppendTaggedBlob (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag,
-                  const uint8_t *data, size_t size)
-{
-  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
-  /* 2 */
-  if (size>0)
-    {
-      written += AppendBlockHeader (start, size, CcnbParser::CCN_BLOB);
-      start.Write (data, size);
-      written += size;
-      /* size */
-    }
-  written += AppendCloser (start);
-  /* 1 */
-
-  return written;
-}
-
-size_t
-EncodingHelper::EstimateTaggedBlob (CcnbParser::ccn_dtag dtag, size_t size)
-{
-  if (size>0)
-    return EstimateBlockHeader (dtag) + EstimateBlockHeader (size) + size + 1;
-  else
-    return EstimateBlockHeader (dtag) + 1;
-}
-
-size_t
-EncodingHelper::AppendString (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag,
-                                  const std::string &string)
-{
-  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
-  {
-    written += AppendBlockHeader (start, string.size (), CcnbParser::CCN_UDATA);
-    start.Write (reinterpret_cast<const uint8_t*> (string.c_str ()), string.size ());
-    written += string.size ();
-  }
-  written += AppendCloser (start);
-
-  return written;
-}
-
-size_t
-EncodingHelper::EstimateString (CcnbParser::ccn_dtag dtag, const std::string &string)
-{
-  return EstimateBlockHeader (dtag) + EstimateBlockHeader (string.size ()) + string.size () + 1;
-}
-
-
-} // namespace ndn
-} // namespace ns3
diff --git a/disabled/ndn-interest-header-ccnb.cc b/disabled/ndn-interest-header-ccnb.cc
deleted file mode 100644
index 1c4e3d6..0000000
--- a/disabled/ndn-interest-header-ccnb.cc
+++ /dev/null
@@ -1,296 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * 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>
- */
-
-///< #CCN_PR_SCOPE0 (0x20) local scope,
-///< #CCN_PR_SCOPE1 (0x40) this host,
-///< #CCN_PR_SCOPE2 (0x80) immediate neighborhood
-
-#include "ndn-interest-header-ccnb.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.Interest");
-
-namespace ns3 {
-namespace ndn {
-
-NS_OBJECT_ENSURE_REGISTERED (Interest);
-
-TypeId
-Interest::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Interest")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Interest> ()
-    ;
-  return tid;
-}
-  
-
-Interest::Interest ()
-  : m_name ()
-  , m_minSuffixComponents (-1)
-  , m_maxSuffixComponents (-1)
-  , m_exclude ()
-  , m_childSelector (false)
-  , m_answerOriginKind (false)
-  , m_scope (-1)
-  , m_interestLifetime (Seconds (0))
-  , m_nonce (0)
-  , m_nackType (NORMAL_INTEREST)
-{
-}
-
-Interest::Interest (const Interest &interest)
-  : m_name                (Create<Name> (interest.GetName ()))
-  , m_minSuffixComponents (interest.m_minSuffixComponents)
-  , m_maxSuffixComponents (interest.m_maxSuffixComponents)
-  , m_exclude             (interest.IsEnabledExclude () ? Create<Name> (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)
-  , m_nackType            (interest.m_nackType)
-{
-}
-
-Ptr<Interest>
-Interest::GetInterest (Ptr<Packet> packet)
-{
-  Ptr<Interest> interest = Create<Interest> ();
-  packet->RemoveHeader (*interest);
-
-  return interest;
-}
-
-void
-Interest::SetName (Ptr<Name> name)
-{
-  m_name = name;
-}
-
-const Name&
-Interest::GetName () const
-{
-  if (m_name==0) throw InterestException();
-  return *m_name;
-}
-
-Ptr<const Name>
-Interest::GetNamePtr () const
-{
-  return m_name;
-}
-
-void
-Interest::SetMinSuffixComponents (int32_t value)
-{
-  m_minSuffixComponents = value;
-}
-
-int32_t
-Interest::GetMinSuffixComponents () const
-{
-  return m_minSuffixComponents;
-}
-
-void
-Interest::SetMaxSuffixComponents (int32_t value)
-{
-  m_maxSuffixComponents = value;
-}
-
-int32_t
-Interest::GetMaxSuffixComponents () const
-{
-  return m_maxSuffixComponents;
-}
-
-void
-Interest::SetExclude (Ptr<Name> exclude)
-{
-  m_exclude = exclude;
-}
-
-bool
-Interest::IsEnabledExclude () const
-{
-  return m_exclude!=0;
-}
-
-const Name&
-Interest::GetExclude () const
-{
-  if (m_exclude==0) throw InterestException();
-  return *m_exclude;
-}
-
-void
-Interest::SetChildSelector (bool value)
-{
-  m_childSelector = value;
-}
-
-bool
-Interest::IsEnabledChildSelector () const
-{
-  return m_childSelector;
-}
-
-void
-Interest::SetAnswerOriginKind (bool value)
-{
-  m_answerOriginKind = value;
-}
-
-bool
-Interest::IsEnabledAnswerOriginKind () const
-{
-  return m_answerOriginKind;
-}
-
-void
-Interest::SetScope (int8_t scope)
-{
-  m_scope = scope;
-}
-
-int8_t
-Interest::GetScope () const
-{
-  return m_scope;
-}
-
-void
-Interest::SetInterestLifetime (Time lifetime)
-{
-  m_interestLifetime = lifetime;
-}
-
-Time
-Interest::GetInterestLifetime () const
-{
-  return m_interestLifetime;
-}
-
-void
-Interest::SetNonce (uint32_t nonce)
-{
-  m_nonce = nonce;
-}
-
-uint32_t
-Interest::GetNonce () const
-{
-  return m_nonce;
-}
-
-void
-Interest::SetNack (uint32_t nackType)
-{
-  m_nackType = nackType;
-}
-
-uint32_t
-Interest::GetNack () const
-{
-  return m_nackType;
-}
-
-uint32_t
-Interest::GetSerializedSize (void) const
-{
-  // unfortunately, we don't know exact header size in advance
-  return EncodingHelper::GetSerializedSize (*this);
-}
-    
-void
-Interest::Serialize (Buffer::Iterator start) const
-{
-  size_t size = EncodingHelper::Serialize (start, *this);
-  NS_UNUSED (size);
-  NS_LOG_INFO ("Serialize size = " << size);
-}
-
-uint32_t
-Interest::Deserialize (Buffer::Iterator start)
-{
-  return DecodingHelper::Deserialize (start, *this); // \todo Debugging is necessary
-}
-
-TypeId
-Interest::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-  
-void
-Interest::Print (std::ostream &os) const
-{
-  os << "I: " << GetName ();
-  
-  return;
-  os << "<Interest>\n  <Name>" << GetName () << "</Name>\n";
-  if (GetNack ()>0)
-    {
-      os << "  <NACK>";
-      switch (GetNack ())
-        {
-        case NACK_LOOP:
-          os << "loop";
-          break;
-        case NACK_CONGESTION:
-          os << "congestion";
-          break;
-        default:
-          os << "unknown";
-          break;
-        }
-      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";
-  if ( !GetInterestLifetime ().IsZero() )
-    os << "  <InterestLifetime>" << GetInterestLifetime () << "</InterestLifetime>\n";
-  if (GetNonce ()>0)
-    os << "  <Nonce>" << GetNonce () << "</Nonce>\n";
-  os << "</Interest>";
-}
-
-} // namespace ndn
-} // namespace ns3
-
diff --git a/disabled/ndn-interest-header-ccnb.h b/disabled/ndn-interest-header-ccnb.h
deleted file mode 100644
index 1daa7d1..0000000
--- a/disabled/ndn-interest-header-ccnb.h
+++ /dev/null
@@ -1,419 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * 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>
- */
-
-#ifndef _NDN_INTEREST_HEADER_CCNB_H_
-#define _NDN_INTEREST_HEADER_CCNB_H_
-
-#include "ns3/integer.h"
-#include "ns3/header.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/nstime.h"
-
-#include <string>
-#include <vector>
-#include <list>
-
-#include "ndn-name.h"
-
-namespace ns3 {
-
-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 Interest 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
-  **/
-class Interest : public SimpleRefCount<Interest, Header>
-{
-public:
-  /**
-   * \brief Constructor
-   *
-   * Creates a null header
-   **/
-  Interest ();
-
-  /**
-   * @brief Copy constructor
-   */
-  Interest (const Interest &interest);
-
-  /**
-   * \brief Set interest name
-   *
-   * Sets name of the interest. For example, SetName( ndnName("prefix")("postfix") );
-   * @param[in] name const pointer to ndnName object that contains an interest name
-   **/
-  void
-  SetName (Ptr<Name> name);
-
-
-  /**
-   * \brief Get interest name
-   *
-   * Gets name of the interest.
-   **/
-  const Name&
-  GetName () const;
-
-  /**
-   * @brief Get smart pointer to the interest name (to avoid extra memory usage)
-   */
-  Ptr<const Name>
-  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 (ndnName("exclude1")("exclude2")("exclude3"))
-   * @param[in] exclude const pointer to ndnName to be excluded 
-   **/
-  void
-  SetExclude (Ptr<Name> exclude);
-
-  /**
-   * \brief Check if interest conatins exclude filter
-   *
-   */ 
-  bool
-  IsEnabledExclude () const;
-  
-  /**
-   * \brief Get exclude filter 
-   */
-  const Name&
-  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).
-   * Scope 1 limits propagation to the applications on the originating host. 
-   * Scope 2 limits propagation to no further than the next host. 
-   * Other values are not defined, and will cause the Interest message to be dropped.
-   * Note that this is not a hop count - the value is not decremented as the interest is forwarded.
-   * @param[in] scope interest scope
-   */
-  void
-  SetScope (int8_t scope);
-
-  /**
-   * \brief Get Scope value
-   * Scope limits where the Interest may propagate. 
-   * Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host).
-   * Scope 1 limits propagation to the applications on the originating host. 
-   * Scope 2 limits propagation to no further than the next host. 
-   * Other values are not defined, and will cause the Interest message to be dropped.
-   * Note that this is not a hop count - the value is not decremented as the interest is forwarded.
-   */
-  int8_t
-  GetScope () const;
-
-  /**
-   * \brief Set InterestLifetime
-   * InterestLifetime indicates the (approximate) time remaining before the interest times out.
-   * The timeout is relative to the arrival time of the interest at the current node.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   * @param[in] time interest lifetime  
-   */ 
-  void
-  SetInterestLifetime (Time time);
-
-  /**
-   * \brief Get InterestLifetime value
-   * InterestLifetime indicates the (approximate) time remaining before the interest times out.
-   * The timeout is relative to the arrival time of the interest at the current node.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   */ 
-  Time
-  GetInterestLifetime () const;
-
-  /**
-   * \brief Set Nonce
-   * Nonce carries a randomly-genenerated bytestring that is used to detect and discard duplicate Interest messages.
-   * @param[in] nonce Unique packet identification number
-   */
-  void
-  SetNonce (uint32_t nonce);
-
-  /**
-   * \brief Get Nonce value
-   * Nonce carries a randomly-genenerated bytestring that is used to detect and discard duplicate Interest messages.
-   *
-   */
-  uint32_t
-  GetNonce () const;
-  
-  /**
-   * @brief NACK Type
-   * Specifies the type of Interest packet
-   */
-  enum
-    {
-      NORMAL_INTEREST = 0,
-      NACK_LOOP = 10,
-      NACK_CONGESTION = 11,
-      NACK_GIVEUP_PIT = 12,
-    };
-
-  /**
-   * \brief Mark the Interest as a Negative Acknowledgement
-   * Three types of NACKs are supported
-   * 1. NACK_LOOP 
-   * 2. NACK_CONGESTION
-   * 3. NACK_GIVEUP_PIT
-   * @param[in] nackType  NACK_LOOP or NACK_CONGESTION or NACK_GIVEUP_PIT or NORMAL_INTEREST
-   */
-  void
-  SetNack (uint32_t nackType);
-    
-  /**
-  * \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
-  GetNack () const;
-
-  //////////////////////////////////////////////////////////////////
-
-  static TypeId GetTypeId (void); ///< @brief Get TypeId of the class
-  virtual TypeId GetInstanceTypeId (void) const; ///< @brief Get TypeId of the instance
-  
-  /**
-   * \brief Print Interest packet 
-   */
-  virtual void Print (std::ostream &os) const;
-  
-  /**
-   * \brief Get the size of Interest packet
-   * Returns the Interest packet size after serialization
-   */
-  virtual uint32_t GetSerializedSize (void) const;
-  
-  /**
-   * \brief Serialize Interest packet
-   * Serializes Interest packet into Buffer::Iterator
-   * @param[in] start buffer to contain serialized Interest packet
-   */
-  virtual void Serialize (Buffer::Iterator start) const;
-  
-  /**
-   * \brief Deserialize Interest packet
-   * Deserializes Buffer::Iterator into Interest packet
-   * @param[in] start buffer that contains serialized Interest packet
-   */ 
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-  /**
-   * @brief Cheat for python bindings
-   */
-  static Ptr<Interest>
-  GetInterest (Ptr<Packet> packet);
-  
-private:
-  Ptr<Name> 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<Name> 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
-  Time  m_interestLifetime;      ///< InterestLifetime
-  uint32_t m_nonce;              ///< Nonce. not used if zero
-  uint32_t m_nackType;           ///< Negative Acknowledgement type
-};
-
-/**
- * @ingroup ndn-exceptions
- * @brief Class for Interest parsing exception 
- */
-class InterestException {};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_INTEREST_HEADER_CCNB_H_
diff --git a/model/ndn-content-object.cc b/model/ndn-content-object.cc
index 81d92f0..ecf3197 100644
--- a/model/ndn-content-object.cc
+++ b/model/ndn-content-object.cc
@@ -120,6 +120,18 @@
 }
 
 void
+ContentObject::SetKeyLocator (Ptr<Name> keyLocator)
+{
+  m_keyLocator = keyLocator;
+}
+
+Ptr<const Name>
+ContentObject::GetKeyLocator () const
+{
+  return m_keyLocator;
+}
+
+void
 ContentObject::Print (std::ostream &os) const
 {
   os << "D: " << GetName ();
diff --git a/model/ndn-content-object.h b/model/ndn-content-object.h
index 6fa60dd..c79ddf9 100644
--- a/model/ndn-content-object.h
+++ b/model/ndn-content-object.h
@@ -122,6 +122,21 @@
   uint32_t
   GetSignature () const;
 
+  /**
+   * @brief Set key locator
+   * @param keyLocator name of the key
+   */
+  void
+  SetKeyLocator (Ptr<Name> keyLocator);
+
+  /**
+   * @brief Get key locator
+   *
+   * Note that only <KeyName> option for the key locator is supported
+   */
+  Ptr<const Name>
+  GetKeyLocator () const;
+  
   //////////////////////////////////////////////////////////////////
   /**
    * @brief Get payload of data packet
@@ -170,6 +185,7 @@
   Time m_timestamp;
   uint32_t m_signature; // 0, means no signature, any other value application dependent (not a real signature)
   Ptr<Packet> m_payload;
+  Ptr<Name> m_keyLocator;
 
   mutable Ptr<const Packet> m_wire;
 };
diff --git a/model/wire/ccnb.h b/model/wire/ccnb.h
new file mode 100644
index 0000000..893d481
--- /dev/null
+++ b/model/wire/ccnb.h
@@ -0,0 +1,94 @@
+/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/* 
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Alexander Afanasyev
+ * 
+ * BSD license, See the doc/LICENSE file for more information
+ * 
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_WIRE_CCNB_H
+#define NDN_WIRE_CCNB_H
+
+#include "ns3/ndn-common.h"
+#include "ns3/ndn-interest.h"
+#include "ns3/ndn-content-object.h"
+
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
+namespace ccnb {
+
+/**
+  * @brief Routines to serialize/deserialize NDN interest in ccnb format
+  *
+  * @see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
+  **/
+class Interest : public Header
+{
+public:
+  Interest ();
+  Interest (Ptr<ndn::Interest> interest);
+
+  Ptr<ndn::Interest>
+  GetInterest ();
+
+  static Ptr<Packet>
+  ToWire (Ptr<const ndn::Interest> interest);
+
+  static Ptr<ndn::Interest>
+  FromWire (Ptr<Packet> packet);
+  
+  //////////////////////////////////////////////////////////////////
+  // from Header
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+  virtual void Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize (void) const;
+  virtual void Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  Ptr<ndn::Interest> m_interest;
+};
+
+
+/**
+  * @brief Routines to serialize/deserialize NDN Data packet in ccnb format
+  *
+  * @see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
+  **/
+class Data : public Header
+{
+public:
+  Data ();
+  Data (Ptr<ndn::ContentObject> data);
+
+  Ptr<ndn::ContentObject>
+  GetData ();
+
+  static Ptr<Packet>
+  ToWire (Ptr<const ndn::ContentObject> data);
+
+  static Ptr<ndn::ContentObject>
+  FromWire (Ptr<Packet> packet);
+  
+  // from Header
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+  virtual void Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize (void) const;
+  virtual void Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  Ptr<ndn::ContentObject> m_data;  
+};
+
+} // ccnb
+} // wire
+
+NDN_NAMESPACE_END
+
+#endif // NDN_WIRE_CCNB_H
diff --git a/disabled/ccnb-parser/common.h b/model/wire/ccnb/ccnb-parser/common.h
similarity index 96%
rename from disabled/ccnb-parser/common.h
rename to model/wire/ccnb/ccnb-parser/common.h
index 260ae74..aa3f68a 100644
--- a/disabled/ccnb-parser/common.h
+++ b/model/wire/ccnb/ccnb-parser/common.h
@@ -21,8 +21,15 @@
 #ifndef _CCNB_PARSER_COMMON_H_
 #define _CCNB_PARSER_COMMON_H_
 
-namespace ns3 {
-namespace ndn {
+#include "ns3/ndn-common.h"
+
+#ifndef NDN_NAMESPACE_BEGIN
+#error "dafaq"
+#endif
+
+NDN_NAMESPACE_BEGIN;
+
+namespace wire {
 
 /**
  * \ingroup ndn
@@ -174,8 +181,9 @@
   CCN_DTAG_CCNProtocolDataUnit = 17702112
 };
 
-} // namespace CcnxParser
-} // namespace ndn
-} // namespace ns3
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_COMMON_H_
diff --git a/disabled/ccnb-parser/syntax-tree/attr.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc
similarity index 93%
rename from disabled/ccnb-parser/syntax-tree/attr.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc
index fda4c77..f661186 100644
--- a/disabled/ccnb-parser/syntax-tree/attr.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc
@@ -21,8 +21,9 @@
 #include "attr.h"
 #include "../common.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 // length length in octets of UTF-8 encoding of tag name - 1 (minimum tag name length is 1) 
@@ -41,6 +42,7 @@
     throw CcnbDecodingException (); // "ATTR must be followed by UDATA field"
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/attr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.h
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/attr.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/attr.h
index 6238aee..37882ad 100644
--- a/disabled/ccnb-parser/syntax-tree/attr.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.h
@@ -24,8 +24,9 @@
 #include "base-attr.h"
 #include <string>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -55,8 +56,9 @@
   std::string m_attr; ///< field holding name of the attribute
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_ATTR_H_
diff --git a/disabled/ccnb-parser/syntax-tree/base-attr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.h
similarity index 92%
rename from disabled/ccnb-parser/syntax-tree/base-attr.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.h
index d6890a1..c2b2627 100644
--- a/disabled/ccnb-parser/syntax-tree/base-attr.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.h
@@ -23,8 +23,9 @@
 
 #include "udata.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -40,8 +41,9 @@
   Ptr<Udata> m_value; ///< \brief Value of the attribute
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_BASE_ATTR_H_
diff --git a/disabled/ccnb-parser/syntax-tree/base-tag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h
similarity index 93%
rename from disabled/ccnb-parser/syntax-tree/base-tag.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h
index 403dcb4..1449d9f 100644
--- a/disabled/ccnb-parser/syntax-tree/base-tag.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h
@@ -24,8 +24,9 @@
 #include "block.h"
 #include <list>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -48,9 +49,10 @@
   BaseTag() { }
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_BASE_TAG_H_
 
diff --git a/disabled/ccnb-parser/syntax-tree/blob.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc
similarity index 92%
rename from disabled/ccnb-parser/syntax-tree/blob.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc
index 6df6012..6c2ab2e 100644
--- a/disabled/ccnb-parser/syntax-tree/blob.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc
@@ -20,8 +20,9 @@
 
 #include "blob.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 Blob::Blob (Buffer::Iterator &start, uint32_t length)
@@ -46,6 +47,7 @@
   delete [] m_blob;
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/blob.h b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.h
similarity index 95%
rename from disabled/ccnb-parser/syntax-tree/blob.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/blob.h
index 1745b1d..2b480ca 100644
--- a/disabled/ccnb-parser/syntax-tree/blob.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.h
@@ -23,8 +23,9 @@
 
 #include "block.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -56,8 +57,9 @@
   uint32_t  m_blobSize; ///< @brief field representing size of the BLOB field stored
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_BLOB_H_
diff --git a/disabled/ccnb-parser/syntax-tree/block.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc
similarity index 95%
rename from disabled/ccnb-parser/syntax-tree/block.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/block.cc
index 0d425dd..06c8e2c 100644
--- a/disabled/ccnb-parser/syntax-tree/block.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc
@@ -32,8 +32,9 @@
 
 NS_LOG_COMPONENT_DEFINE ("ndn.CcnbParser.Block");
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /// @cond include_hidden
@@ -94,6 +95,7 @@
 {
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/block.h b/model/wire/ccnb/ccnb-parser/syntax-tree/block.h
similarity index 95%
rename from disabled/ccnb-parser/syntax-tree/block.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/block.h
index 23604f5..caf227f 100644
--- a/disabled/ccnb-parser/syntax-tree/block.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/block.h
@@ -31,8 +31,9 @@
 #include "../visitors/no-argu-visitor.h"
 #include "../visitors/visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -80,8 +81,9 @@
   return ret;
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_BLOCK_H_
diff --git a/disabled/ccnb-parser/syntax-tree/dattr.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.cc
similarity index 91%
rename from disabled/ccnb-parser/syntax-tree/dattr.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/dattr.cc
index dde424c..a37db84 100644
--- a/disabled/ccnb-parser/syntax-tree/dattr.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.cc
@@ -20,8 +20,9 @@
 
 #include "dattr.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 // dictionary attributes are not used (yet?) in CCNx 
@@ -33,6 +34,7 @@
     throw CcnbDecodingException (); // "ATTR must be followed by UDATA field"
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/dattr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/dattr.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h
index e4c622c..3728d6e 100644
--- a/disabled/ccnb-parser/syntax-tree/dattr.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h
@@ -23,8 +23,9 @@
 
 #include "base-attr.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -54,8 +55,9 @@
   uint32_t m_dattr; ///< \brief Dictionary code of DATTR
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_DATTR_H_
diff --git a/disabled/ccnb-parser/syntax-tree/dtag.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
similarity index 96%
rename from disabled/ccnb-parser/syntax-tree/dtag.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
index 129b363..b7af79b 100644
--- a/disabled/ccnb-parser/syntax-tree/dtag.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
@@ -23,8 +23,9 @@
 #include "base-attr.h"
 #include "base-tag.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 Dtag::Dtag (Buffer::Iterator &start, uint32_t dtag)
@@ -84,6 +85,7 @@
   // Block::counter ++;
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/dtag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h
similarity index 95%
rename from disabled/ccnb-parser/syntax-tree/dtag.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h
index cf9871e..0d00f50 100644
--- a/disabled/ccnb-parser/syntax-tree/dtag.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h
@@ -23,8 +23,9 @@
 
 #include "base-tag.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -59,8 +60,9 @@
   uint32_t m_dtag; ///< \brief Dictionary code for DTAG
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_DTAG_H_
diff --git a/disabled/ccnb-parser/syntax-tree/ext.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc
similarity index 90%
rename from disabled/ccnb-parser/syntax-tree/ext.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc
index b80743c..79ac738 100644
--- a/disabled/ccnb-parser/syntax-tree/ext.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc
@@ -20,8 +20,9 @@
 
 #include "ext.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 Ext::Ext (Buffer::Iterator &start, uint32_t extSubtype)
@@ -29,6 +30,7 @@
   m_extSubtype = extSubtype;
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/ext.h b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.h
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/ext.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/ext.h
index 072405c..532eb87 100644
--- a/disabled/ccnb-parser/syntax-tree/ext.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.h
@@ -23,8 +23,9 @@
 
 #include "block.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -54,8 +55,9 @@
   uint64_t m_extSubtype; ///< \brief Extension type
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_EXT_H_
diff --git a/disabled/ccnb-parser/syntax-tree/tag.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/tag.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc
index 5a0d96c..8cd7fd1 100644
--- a/disabled/ccnb-parser/syntax-tree/tag.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc
@@ -22,8 +22,9 @@
 
 #include "base-attr.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 Tag::Tag (Buffer::Iterator &start, uint32_t length)
@@ -63,6 +64,7 @@
   start.ReadU8 (); // read CCN_CLOSE
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/tag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.h
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/tag.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/tag.h
index 94f4d32..8949119 100644
--- a/disabled/ccnb-parser/syntax-tree/tag.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.h
@@ -24,8 +24,9 @@
 #include "base-tag.h"
 #include <string>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -55,8 +56,9 @@
   std::string m_tag; ///< \brief Name of TAG block
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_TAG_H_
diff --git a/disabled/ccnb-parser/syntax-tree/udata.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc
similarity index 93%
rename from disabled/ccnb-parser/syntax-tree/udata.cc
rename to model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc
index cd69aba..9d3c8df 100644
--- a/disabled/ccnb-parser/syntax-tree/udata.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc
@@ -20,8 +20,9 @@
 
 #include "udata.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 Udata::Udata (Buffer::Iterator &start, uint32_t length)
@@ -43,6 +44,7 @@
     throw CcnbDecodingException ();
 }
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/syntax-tree/udata.h b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.h
similarity index 94%
rename from disabled/ccnb-parser/syntax-tree/udata.h
rename to model/wire/ccnb/ccnb-parser/syntax-tree/udata.h
index b589ea4..463898f 100644
--- a/disabled/ccnb-parser/syntax-tree/udata.h
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.h
@@ -24,8 +24,9 @@
 #include "block.h"
 #include <string>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -53,8 +54,9 @@
   std::string m_udata; ///< \brief field holding a parsed UDATA value of the block
 };
 
-}
-}
-}
+} // namespace CcnbParser
+} // namespace wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_UDATA_H_
diff --git a/disabled/ccnb-parser/visitors/content-type-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc
similarity index 93%
rename from disabled/ccnb-parser/visitors/content-type-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc
index a89b99c..91112da 100644
--- a/disabled/ccnb-parser/visitors/content-type-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc
@@ -21,8 +21,9 @@
 #include "content-type-visitor.h"
 #include "../syntax-tree/blob.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -47,6 +48,7 @@
   throw CcnbDecodingException ();
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/content-type-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/content-type-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.h
index 2cbd883..aa9abbf 100644
--- a/disabled/ccnb-parser/visitors/content-type-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual boost::any visit (Udata &n); ///< Throws parsing error if BLOB object is encountered
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_CONTENT_TYPE_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc
similarity index 96%
rename from disabled/ccnb-parser/visitors/depth-first-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc
index 305fff6..b82b140 100644
--- a/disabled/ccnb-parser/visitors/depth-first-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc
@@ -30,8 +30,9 @@
 
 #include <boost/foreach.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -105,6 +106,7 @@
   return n.m_extSubtype;
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/depth-first-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.h
index 2257802..be701b1 100644
--- a/disabled/ccnb-parser/visitors/depth-first-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.h
@@ -23,8 +23,9 @@
 
 #include "visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual boost::any visit (Ext&,   boost::any);
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_DEPTH_FIRST_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/name-components-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
similarity index 90%
rename from disabled/ccnb-parser/visitors/name-components-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
index ffb242e..13043d3 100644
--- a/disabled/ccnb-parser/visitors/name-components-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
@@ -18,15 +18,16 @@
  * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
-#include "name-components-visitor.h"
+#include "name-visitor.h"
 
 #include "string-visitor.h"
 #include "../syntax-tree/dtag.h"
 
 #include "ns3/ndn-name.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 void
@@ -45,8 +46,8 @@
         throw CcnbDecodingException ();
       components.Add (
                       boost::any_cast<std::string> ((*n.m_nestedTags.begin())->accept(
-                                                                                        stringVisitor
-                                                                                        )));
+                                                                                      stringVisitor
+                                                                                      )));
       break;
     default:
       // ignore any other components
@@ -55,6 +56,7 @@
     }
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/name-components-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.h
similarity index 88%
rename from disabled/ccnb-parser/visitors/name-components-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/name-visitor.h
index 332d95d..f71e202 100644
--- a/disabled/ccnb-parser/visitors/name-components-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.h
@@ -23,8 +23,9 @@
 
 #include "void-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -34,12 +35,13 @@
 class NameVisitor : public VoidDepthFirstVisitor
 {
 public:
-  virtual void visit (Dtag &n, boost::any param/*should be CcnxName* */);
+  virtual void visit (Dtag &n, boost::any param/*should be Name* */);
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_NAME_COMPONENTS_VISITOR_H_
 
diff --git a/disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
similarity index 96%
rename from disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
index 53f1122..6393e7e 100644
--- a/disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
@@ -30,8 +30,9 @@
 
 #include <boost/foreach.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -105,6 +106,7 @@
   return n.m_extSubtype;
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.h
index 4b6c2e9..c400083 100644
--- a/disabled/ccnb-parser/visitors/no-argu-depth-first-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual boost::any visit (Ext&  );
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_NO_ARGU_DEPTH_FIRST_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/no-argu-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h
similarity index 95%
rename from disabled/ccnb-parser/visitors/no-argu-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h
index abbf843..d603a0a 100644
--- a/disabled/ccnb-parser/visitors/no-argu-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h
@@ -24,8 +24,9 @@
 #include "../common.h"
 #include <boost/any.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -49,8 +50,9 @@
   virtual ~NoArguVisitor () { }
 };
   
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_NO_ARGU_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/non-negative-integer-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc
similarity index 94%
rename from disabled/ccnb-parser/visitors/non-negative-integer-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc
index d5fc041..9c2fee3 100644
--- a/disabled/ccnb-parser/visitors/non-negative-integer-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc
@@ -24,8 +24,9 @@
 #include "../syntax-tree/udata.h"
 #include <sstream>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -48,6 +49,7 @@
   return static_cast<uint32_t> (value);
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/non-negative-integer-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/non-negative-integer-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.h
index 2bb9f91..027e0eb 100644
--- a/disabled/ccnb-parser/visitors/non-negative-integer-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -40,8 +41,9 @@
   virtual boost::any visit (Udata &n);
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_NON_NEGATIVE_INTEGER_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/string-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc
similarity index 93%
rename from disabled/ccnb-parser/visitors/string-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc
index 5f44bf3..5c41779 100644
--- a/disabled/ccnb-parser/visitors/string-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc
@@ -22,8 +22,9 @@
 #include "../syntax-tree/udata.h"
 #include "../syntax-tree/blob.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -40,6 +41,7 @@
   return n.m_udata;
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/string-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.h
similarity index 93%
rename from disabled/ccnb-parser/visitors/string-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/string-visitor.h
index ea285d1..b6a74fd 100644
--- a/disabled/ccnb-parser/visitors/string-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -40,8 +41,9 @@
   virtual boost::any visit (Udata &n);
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_STRING_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/timestamp-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc
similarity index 95%
rename from disabled/ccnb-parser/visitors/timestamp-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc
index 5917711..efea82a 100644
--- a/disabled/ccnb-parser/visitors/timestamp-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc
@@ -23,8 +23,9 @@
 
 #include "ns3/nstime.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any/*Time*/
@@ -60,6 +61,7 @@
   throw CcnbDecodingException ();
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/timestamp-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/timestamp-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.h
index 3884ff6..a5ad224 100644
--- a/disabled/ccnb-parser/visitors/timestamp-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -40,8 +41,9 @@
   virtual boost::any/*Time*/ visit (Udata &n); ///< Throws parsing error if UDATA object is encountered
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_TIMESTAMP_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/uint32t-blob-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc
similarity index 93%
rename from disabled/ccnb-parser/visitors/uint32t-blob-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc
index 351cc36..f5620ae 100644
--- a/disabled/ccnb-parser/visitors/uint32t-blob-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc
@@ -21,8 +21,9 @@
 #include "uint32t-blob-visitor.h"
 #include "../syntax-tree/blob.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 boost::any
@@ -42,6 +43,7 @@
   throw CcnbDecodingException ();
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/uint32t-blob-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/uint32t-blob-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.h
index de5f374..5d30405 100644
--- a/disabled/ccnb-parser/visitors/uint32t-blob-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.h
@@ -23,8 +23,9 @@
 
 #include "no-argu-depth-first-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual boost::any visit (Udata &n); ///< Throws parsing error if BLOB object is encountered
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_UINT32T_BLOB_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/visitor.h b/model/wire/ccnb/ccnb-parser/visitors/visitor.h
similarity index 95%
rename from disabled/ccnb-parser/visitors/visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/visitor.h
index 76744ee..ee9f831 100644
--- a/disabled/ccnb-parser/visitors/visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/visitor.h
@@ -24,8 +24,9 @@
 #include "../common.h"
 #include <boost/any.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -49,8 +50,9 @@
   virtual ~Visitor () { }
 };                                                
                                                   
-}
-}
-}                                                 
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
                                                   
 #endif // _CCNB_PARSER_VISITOR_H_                             
diff --git a/disabled/ccnb-parser/visitors/void-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc
similarity index 96%
rename from disabled/ccnb-parser/visitors/void-depth-first-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc
index 1a1770a..8a8adde 100644
--- a/disabled/ccnb-parser/visitors/void-depth-first-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc
@@ -30,8 +30,9 @@
 
 #include <boost/foreach.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 void
@@ -98,6 +99,7 @@
   // uint64_t n.m_extSubtype;
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/void-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/void-depth-first-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.h
index 2e1862e..96f8b6f 100644
--- a/disabled/ccnb-parser/visitors/void-depth-first-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.h
@@ -23,8 +23,9 @@
 
 #include "void-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual void visit (Ext&,   boost::any);
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_VOID_DEPTH_FIRST_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
similarity index 96%
rename from disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
rename to model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
index 439bf93..5bcecb8 100644
--- a/disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
@@ -30,8 +30,9 @@
 
 #include <boost/foreach.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 void
@@ -98,6 +99,7 @@
   // uint64_t n.m_extSubtype;
 }
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
similarity index 94%
rename from disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
index 995f90a..59b59d7 100644
--- a/disabled/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
@@ -23,8 +23,9 @@
 
 #include "void-no-argu-visitor.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -43,8 +44,9 @@
   virtual void visit (Ext&  );
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_VOID_NO_ARGU_DEPTH_FIRST_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/void-no-argu-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h
similarity index 95%
rename from disabled/ccnb-parser/visitors/void-no-argu-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h
index 6dccf4e..a98d933 100644
--- a/disabled/ccnb-parser/visitors/void-no-argu-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h
@@ -23,8 +23,9 @@
 
 #include "../common.h"
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -48,8 +49,9 @@
   virtual ~VoidNoArguVisitor () { }
 };
   
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_VOID_NO_ARGU_VISITOR_H_
diff --git a/disabled/ccnb-parser/visitors/void-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-visitor.h
similarity index 95%
rename from disabled/ccnb-parser/visitors/void-visitor.h
rename to model/wire/ccnb/ccnb-parser/visitors/void-visitor.h
index 6ad7eed..8c51e21 100644
--- a/disabled/ccnb-parser/visitors/void-visitor.h
+++ b/model/wire/ccnb/ccnb-parser/visitors/void-visitor.h
@@ -24,8 +24,9 @@
 #include "../common.h"
 #include <boost/any.hpp>
 
-namespace ns3 {
-namespace ndn {
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
 namespace CcnbParser {
 
 /**
@@ -49,8 +50,9 @@
   virtual ~VoidVisitor () { }
 };
 
-}
-}
-}
+} // CcnbParser
+} // wire
+
+NDN_NAMESPACE_END
 
 #endif // _CCNB_PARSER_VOID_VISITOR_H_
diff --git a/model/wire/ccnb/wire-ccnb-data.cc b/model/wire/ccnb/wire-ccnb-data.cc
new file mode 100644
index 0000000..767d57b
--- /dev/null
+++ b/model/wire/ccnb/wire-ccnb-data.cc
@@ -0,0 +1,505 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * 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>
+ */
+
+#include "../ccnb.h"
+
+#include "wire-ccnb.h"
+
+#include "ns3/log.h"
+
+#include "ccnb-parser/common.h"
+#include "ccnb-parser/visitors/void-depth-first-visitor.h"
+#include "ccnb-parser/visitors/name-visitor.h"
+#include "ccnb-parser/visitors/non-negative-integer-visitor.h"
+#include "ccnb-parser/visitors/timestamp-visitor.h"
+#include "ccnb-parser/visitors/string-visitor.h"
+#include "ccnb-parser/visitors/uint32t-blob-visitor.h"
+#include "ccnb-parser/visitors/content-type-visitor.h"
+
+#include "ccnb-parser/syntax-tree/block.h"
+#include "ccnb-parser/syntax-tree/dtag.h"
+
+#include <boost/foreach.hpp>
+
+NS_LOG_COMPONENT_DEFINE ("ndn.wire.Ccnb.Data");
+
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
+namespace ccnb {
+
+// const std::string DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
+
+class DataTrailer : public Trailer
+{
+public:
+  DataTrailer ()
+  {
+  }
+
+  static TypeId GetTypeId ()
+  {
+    static TypeId tid = TypeId ("ns3::ndn::Data::Ccnb::Closer")
+      .SetGroupName ("Ndn")
+      .SetParent<Trailer> ()
+      .AddConstructor<DataTrailer> ()
+      ;
+    return tid;
+  }
+
+  virtual TypeId GetInstanceTypeId (void) const
+  {
+    return GetTypeId ();
+  }
+
+  virtual void Print (std::ostream &os) const
+  {
+  }
+
+  virtual uint32_t GetSerializedSize (void) const
+  {
+    return 2;
+  }
+
+  virtual void Serialize (Buffer::Iterator end) const
+  {
+    Buffer::Iterator i = end;
+    i.Prev (2); // Trailer interface requires us to go backwards
+
+    i.WriteU8 (0x00); // </Content>
+    i.WriteU8 (0x00); // </ContentObject>
+  }
+
+  virtual uint32_t Deserialize (Buffer::Iterator end)
+  {
+    Buffer::Iterator i = end;
+    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;
+  }
+};
+
+NS_OBJECT_ENSURE_REGISTERED (Data);
+NS_OBJECT_ENSURE_REGISTERED (DataTrailer);
+
+TypeId
+Data::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ndn::Data::Ccnb")
+    .SetGroupName ("Ndn")
+    .SetParent<Header> ()
+    .AddConstructor<Data> ()
+    ;
+  return tid;
+}
+
+TypeId
+Data::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+Data::Data ()
+  : m_data (Create<ndn::ContentObject> ())
+{
+}
+
+Data::Data (Ptr<ndn::ContentObject> data)
+  : m_data (data)
+{
+}
+
+Ptr<ndn::ContentObject>
+Data::GetData ()
+{
+  return m_data;
+}
+
+Ptr<Packet>
+Data::ToWire (Ptr<const ndn::ContentObject> data)
+{
+  static DataTrailer trailer;
+
+  Ptr<const Packet> p = data->GetWire ();
+  if (!p)
+    {
+      Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
+      Data wireEncoding (ConstCast<ndn::ContentObject> (data));
+      packet->AddHeader (wireEncoding);
+      packet->AddTrailer (trailer);
+      data->SetWire (packet);
+
+      p = packet;
+    }
+
+  return p->Copy ();
+}
+
+Ptr<ndn::ContentObject>
+Data::FromWire (Ptr<Packet> packet)
+{
+  static DataTrailer trailer;
+
+  Ptr<ndn::ContentObject> data = Create<ndn::ContentObject> ();
+  data->SetWire (packet->Copy ());
+
+  Data wireEncoding (data);
+  packet->RemoveHeader (wireEncoding);
+  packet->RemoveTrailer (trailer);
+
+  data->SetPayload (packet);
+
+  return data;
+}
+
+void
+Data::Serialize (Buffer::Iterator start) const
+{
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_ContentObject, CcnbParser::CCN_DTAG); // <ContentObject>
+
+  // fake signature
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Signature, CcnbParser::CCN_DTAG); // <Signature>
+  // Signature ::= √DigestAlgorithm?
+  //               Witness?
+  //               √SignatureBits
+  // if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
+  //   {
+  //     Ccnb::AppendString (start, CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
+  //   }
+  Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_SignatureBits, m_data->GetSignature ()); // <SignatureBits />
+  Ccnb::AppendCloser (start);                                    // </Signature>
+
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);    // <Name>
+  Ccnb::AppendName (start, m_data->GetName()); //   <Component>...</Component>...
+  Ccnb::AppendCloser (start);                                  // </Name>
+
+  // fake signature
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_SignedInfo, CcnbParser::CCN_DTAG); // <SignedInfo>
+  // SignedInfo ::= √PublisherPublicKeyDigest
+  //                √Timestamp
+  //                √Type?
+  //                √FreshnessSeconds?
+  //                FinalBlockID?
+  //                KeyLocator?
+  // Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_PublisherPublicKeyDigest,         // <PublisherPublicKeyDigest>...
+  //                         GetSignedInfo ().GetPublisherPublicKeyDigest ());
+
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Timestamp, CcnbParser::CCN_DTAG);            // <Timestamp>...
+  Ccnb::AppendTimestampBlob (start, m_data->GetTimestamp ());
+  Ccnb::AppendCloser (start);
+
+  // 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;
+
+  //     Ccnb::AppendTaggedBlob (start, CCN_DTAG_Type, type, 3);
+  //   }
+  if (m_data->GetFreshness () > Seconds(0))
+    {
+      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_FreshnessSeconds, CcnbParser::CCN_DTAG);
+      Ccnb::AppendNumber (start, m_data->GetFreshness ().ToInteger (Time::S));
+      Ccnb::AppendCloser (start);
+    }
+  if (m_data->GetKeyLocator () != 0)
+    {
+      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_KeyLocator, CcnbParser::CCN_DTAG); // <KeyLocator>
+      {
+        Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_KeyName, CcnbParser::CCN_DTAG);    // <KeyName>
+        {
+          Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);       // <Name>
+          Ccnb::AppendName (start, *m_data->GetKeyLocator ());   //   <Component>...</Component>...
+          Ccnb::AppendCloser (start);                                     // </Name>
+        }
+        Ccnb::AppendCloser (start);                                     // </KeyName>
+      }
+      Ccnb::AppendCloser (start);                                     // </KeyLocator>
+    }
+
+  Ccnb::AppendCloser (start);                                     // </SignedInfo>
+
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Content, CcnbParser::CCN_DTAG); // <Content>
+
+  // there are no closing tags !!!
+  // The closing tag is handled by ContentObjectTail
+}
+
+uint32_t
+Data::GetSerializedSize () const
+{
+  size_t written = 0;
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_ContentObject); // <ContentObject>
+
+  // fake signature
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Signature); // <Signature>
+  // Signature ::= DigestAlgorithm?
+  //               Witness?
+  //               SignatureBits
+  // if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
+  //   {
+  //     written += Ccnb::EstimateString (CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
+  //   }
+  written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits,
+                                       sizeof (m_data->GetSignature ()));      // <SignatureBits />
+  written += 1;                                    // </Signature>
+
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);    // <Name>
+  written += Ccnb::EstimateName (m_data->GetName ()); //   <Component>...</Component>...
+  written += 1;                                  // </Name>
+
+  // fake signature
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_SignedInfo); // <SignedInfo>
+  // SignedInfo ::= √PublisherPublicKeyDigest
+  //                √Timestamp
+  //                √Type?
+  //                √FreshnessSeconds?
+  //                FinalBlockID?
+  //                KeyLocator?
+
+  // written += Ccnb::EstimateTaggedBlob (CCN_DTAG_PublisherPublicKeyDigest,                          // <PublisherPublicKeyDigest>...
+  //                                      sizeof (GetSignedInfo ().GetPublisherPublicKeyDigest ()));
+
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Timestamp);                  // <Timestamp>...
+  written += Ccnb::EstimateTimestampBlob (m_data->GetTimestamp ());
+  written += 1;
+
+  // if (GetSignedInfo ().GetContentType () != DATA)
+  //   {
+  //     written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_Type, 3);
+  //   }
+  if (m_data->GetFreshness () > Seconds(0))
+    {
+      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_FreshnessSeconds);
+      written += Ccnb::EstimateNumber (m_data->GetFreshness ().ToInteger (Time::S));
+      written += 1;
+    }
+
+  if (m_data->GetKeyLocator () != 0)
+    {
+      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_KeyLocator); // <KeyLocator>
+      {
+        written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_KeyName);    // <KeyName>
+        {
+          written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);       // <Name>
+          written += Ccnb::EstimateName (*m_data->GetKeyLocator ());        //   <Component>...</Component>...
+          written += 1;                                               // </Name>
+        }
+        written += 1;                                               // </KeyName>
+      }
+      written += 1;                                               // </KeyLocator>
+    }
+
+  written += 1; // </SignedInfo>
+
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Content); // <Content>
+
+  // there are no closing tags !!!
+  // The closing tag is handled by ContentObjectTail
+  return written;
+}
+
+class ContentObjectVisitor : public CcnbParser::VoidDepthFirstVisitor
+{
+public:
+  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be ContentObject* */)
+  {
+    // uint32_t n.m_dtag;
+    // std::list< Ptr<CcnbParser::Block> > n.m_nestedBlocks;
+    static CcnbParser::NameVisitor nameVisitor;
+    static CcnbParser::NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
+    static CcnbParser::TimestampVisitor          timestampVisitor;
+    static CcnbParser::StringVisitor      stringVisitor;
+    static CcnbParser::Uint32tBlobVisitor uint32tBlobVisitor;
+    static CcnbParser::ContentTypeVisitor contentTypeVisitor;
+
+    ndn::ContentObject &contentObject = *(boost::any_cast<ndn::ContentObject*> (param));
+
+    switch (n.m_dtag)
+      {
+      case CcnbParser::CCN_DTAG_ContentObject:
+        // process nested blocks
+        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+          {
+            block->accept (*this, param);
+          }
+        break;
+      case CcnbParser::CCN_DTAG_Name:
+        {
+          // process name components
+          Ptr<Name> name = Create<Name> ();
+
+          BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+            {
+              block->accept (nameVisitor, &(*name));
+            }
+          contentObject.SetName (name);
+          break;
+        }
+
+      case CcnbParser::CCN_DTAG_Signature:
+        // process nested blocks
+        BOOST_FOREACH (Ptr<CcnbParser::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 CcnbParser::CcnbDecodingException ();
+
+      //   contentObject.GetSignature ().SetDigestAlgorithm
+      //     (boost::any_cast<std::string> ((*n.m_nestedTags.begin())->accept
+      //                                    (stringVisitor)));
+      //   break;
+
+      case CcnbParser::CCN_DTAG_SignatureBits:
+        NS_LOG_DEBUG ("SignatureBits");
+        if (n.m_nestedTags.size ()!=1) // should be only one nested tag
+          throw CcnbParser::CcnbDecodingException ();
+
+        contentObject.SetSignature
+          (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
+                                      (uint32tBlobVisitor)));
+        break;
+
+      case CcnbParser::CCN_DTAG_SignedInfo:
+        // process nested blocks
+        BOOST_FOREACH (Ptr<CcnbParser::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 CcnbParser::CcnbDecodingException ();
+
+      //   contentObject.GetSignedInfo ().SetPublisherPublicKeyDigest
+      //     (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
+      //                                 (uint32tBlobVisitor)));
+      //   break;
+
+      case CcnbParser::CCN_DTAG_Timestamp:
+        NS_LOG_DEBUG ("Timestamp");
+        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
+          throw CcnbParser::CcnbDecodingException ();
+
+        contentObject.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 CcnbParser::CcnbDecodingException ();
+
+      //   contentObject.GetSignedInfo ().SetContentType
+      //     (static_cast<Data::ContentType>
+      //      (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
+      //                                  (contentTypeVisitor))));
+      //   break;
+
+      case CcnbParser::CCN_DTAG_FreshnessSeconds:
+        NS_LOG_DEBUG ("FreshnessSeconds");
+
+        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
+          throw CcnbParser::CcnbDecodingException ();
+
+        contentObject.SetFreshness
+          (Seconds
+           (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
+                                       (nonNegativeIntegerVisitor))));
+        break;
+
+      case CcnbParser::CCN_DTAG_KeyLocator:
+        // process nested blocks
+        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+          {
+            block->accept (*this, param);
+          }
+        break;
+
+      case CcnbParser::CCN_DTAG_KeyName:
+        {
+          if (n.m_nestedTags.size ()!=1) // should be exactly one nested tag
+            throw CcnbParser::CcnbDecodingException ();
+
+          Ptr<CcnbParser::BaseTag> nameTag = DynamicCast<CcnbParser::BaseTag>(n.m_nestedTags.front ());
+          if (nameTag == 0)
+            throw CcnbParser::CcnbDecodingException ();
+
+          // process name components
+          Ptr<Name> name = Create<Name> ();
+
+          BOOST_FOREACH (Ptr<CcnbParser::Block> block, nameTag->m_nestedTags)
+            {
+              block->accept (nameVisitor, &(*name));
+            }
+          contentObject.SetKeyLocator (name);
+          break;
+        }
+
+      case CcnbParser::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
+Data::Deserialize (Buffer::Iterator start)
+{
+  static ContentObjectVisitor contentObjectVisitor;
+
+  Buffer::Iterator i = start;
+  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
+  root->accept (contentObjectVisitor, GetPointer (m_data));
+
+  return i.GetDistanceFrom (start);
+}
+
+void
+Data::Print (std::ostream &os) const
+{
+  os << "D: " << m_data->GetName ();
+  // os << "<ContentObject><Name>" << GetName () << "</Name><Content>";
+}
+
+} // ccnb
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb-interest.cc b/model/wire/ccnb/wire-ccnb-interest.cc
new file mode 100644
index 0000000..8a0ec3b
--- /dev/null
+++ b/model/wire/ccnb/wire-ccnb-interest.cc
@@ -0,0 +1,451 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * 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>
+ */
+
+#include "../ccnb.h"
+
+#include "wire-ccnb.h"
+
+#include "ns3/log.h"
+#include "ns3/unused.h"
+#include "ns3/packet.h"
+
+#include "ccnb-parser/visitors/name-visitor.h"
+#include "ccnb-parser/visitors/non-negative-integer-visitor.h"
+#include "ccnb-parser/visitors/timestamp-visitor.h"
+#include "ccnb-parser/visitors/uint32t-blob-visitor.h"
+
+#include "ccnb-parser/syntax-tree/block.h"
+#include "ccnb-parser/syntax-tree/dtag.h"
+
+#include <boost/foreach.hpp>
+
+NS_LOG_COMPONENT_DEFINE ("ndn.wire.Ccnb.Interest");
+
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
+namespace ccnb {
+
+NS_OBJECT_ENSURE_REGISTERED (Interest);
+
+TypeId
+Interest::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ndn::Interest::Ccnb")
+    .SetGroupName ("Ndn")
+    .SetParent<Header> ()
+    .AddConstructor<Interest> ()
+    ;
+  return tid;
+}
+
+TypeId
+Interest::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+Interest::Interest ()
+  : m_interest (Create<ndn::Interest> ())
+{
+}
+
+Interest::Interest (Ptr<ndn::Interest> interest)
+  : m_interest (interest)
+{
+}
+
+Ptr<ndn::Interest>
+Interest::GetInterest ()
+{
+  return m_interest;
+}
+
+Ptr<Packet>
+Interest::ToWire (Ptr<const ndn::Interest> interest)
+{
+  Ptr<const Packet> p = interest->GetWire ();
+  if (!p)
+    {
+      Ptr<Packet> packet = Create<Packet> (*interest->GetPayload ());
+      Interest wireEncoding (ConstCast<ndn::Interest> (interest));
+      packet->AddHeader (wireEncoding);
+      interest->SetWire (packet);
+
+      p = packet;
+    }
+  
+  return p->Copy ();
+}
+
+Ptr<ndn::Interest>
+Interest::FromWire (Ptr<Packet> packet)
+{
+  Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
+  interest->SetWire (packet->Copy ());
+
+  Interest wireEncoding (interest);
+  packet->RemoveHeader (wireEncoding);
+
+  interest->SetPayload (packet);
+
+  return interest;
+}
+
+void
+Interest::Serialize (Buffer::Iterator start) const
+{
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Interest, CcnbParser::CCN_DTAG); // <Interest>
+  
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
+  Ccnb::AppendName (start, m_interest->GetName());                // <Component>...</Component>...
+  Ccnb::AppendCloser (start);                               // </Name>
+
+  // if (m_interest->GetMinSuffixComponents() >= 0)
+  //   {
+  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_MinSuffixComponents, CcnbParser::CCN_DTAG);
+  //     Ccnb::AppendNumber (start, m_interest->GetMinSuffixComponents ());
+  //     Ccnb::AppendCloser (start);
+  //   }
+  // if (m_interest->GetMaxSuffixComponents() >= 0)
+  //   {
+  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_MaxSuffixComponents, CcnbParser::CCN_DTAG);
+  //     Ccnb::AppendNumber (start, m_interest->GetMaxSuffixComponents ());
+  //     Ccnb::AppendCloser (start);
+  //   }
+  // if (m_interest->IsEnabledExclude() && m_interest->GetExclude().size() > 0)
+  //   {
+  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Exclude, CcnbParser::CCN_DTAG); // <Exclude>
+  //     Ccnb::AppendName (start, m_interest->GetExclude());                // <Component>...</Component>...
+  //     Ccnb::AppendCloser (start);                                  // </Exclude>
+  //   }
+  // if (m_interest->IsEnabledChildSelector())
+  //   {
+  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_ChildSelector, CcnbParser::CCN_DTAG);
+  //     Ccnb::AppendNumber (start, 1);
+  //     Ccnb::AppendCloser (start);
+  //   }
+  // if (m_interest->IsEnabledAnswerOriginKind())
+  //   {
+  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_AnswerOriginKind, CcnbParser::CCN_DTAG);
+  //     Ccnb::AppendNumber (start, 1);
+  //     Ccnb::AppendCloser (start);
+  //   }
+  if (m_interest->GetScope() >= 0)
+    {
+      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Scope, CcnbParser::CCN_DTAG);
+      Ccnb::AppendNumber (start, m_interest->GetScope ());
+      Ccnb::AppendCloser (start);
+    }
+  if (!m_interest->GetInterestLifetime().IsZero())
+    {
+      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_InterestLifetime, CcnbParser::CCN_DTAG);
+      Ccnb::AppendTimestampBlob (start, m_interest->GetInterestLifetime ());
+      Ccnb::AppendCloser (start);
+    }
+  if (m_interest->GetNonce()>0)
+    {
+      uint32_t nonce = m_interest->GetNonce();
+      Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Nonce, nonce);
+    }
+    
+  if (m_interest->GetNack ()>0)
+    {
+      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Nack, CcnbParser::CCN_DTAG);
+      Ccnb::AppendNumber (start, m_interest->GetNack ());
+      Ccnb::AppendCloser (start);
+    }
+  Ccnb::AppendCloser (start); // </Interest>
+}
+
+uint32_t
+Interest::GetSerializedSize () const
+{
+  size_t written = 0;
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Interest); // <Interest>
+  
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
+  written += Ccnb::EstimateName (m_interest->GetName()); // <Component>...</Component>...
+  written += 1; // </Name>
+
+  // if (m_interest->GetMinSuffixComponents() >= 0)
+  //   {
+  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_MinSuffixComponents);
+  //     written += Ccnb::EstimateNumber (m_interest->GetMinSuffixComponents ());
+  //     written += 1;
+  //   }
+  // if (m_interest->GetMaxSuffixComponents() >= 0)
+  //   {
+  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_MaxSuffixComponents);
+  //     written += Ccnb::EstimateNumber (m_interest->GetMaxSuffixComponents ());
+  //     written += 1;
+  //   }
+  // if (m_interest->IsEnabledExclude() && m_interest->GetExclude().size() > 0)
+  //   {
+  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Exclude);
+  //     written += Ccnb::EstimateName (m_interest->GetExclude());                // <Component>...</Component>...
+  //     written += 1;                                  // </Exclude>
+  //   }
+  // if (m_interest->IsEnabledChildSelector())
+  //   {
+  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_ChildSelector);
+  //     written += Ccnb::EstimateNumber (1);
+  //     written += 1;
+  //   }
+  // if (m_interest->IsEnabledAnswerOriginKind())
+  //   {
+  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_AnswerOriginKind);
+  //     written += Ccnb::EstimateNumber (1);
+  //     written += 1;
+  //   }
+  if (m_interest->GetScope() >= 0)
+    {
+      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Scope);
+      written += Ccnb::EstimateNumber (m_interest->GetScope ());
+      written += 1;
+    }
+  if (!m_interest->GetInterestLifetime().IsZero())
+    {
+      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_InterestLifetime);
+      written += Ccnb::EstimateTimestampBlob (m_interest->GetInterestLifetime());
+      written += 1;
+    }
+  if (m_interest->GetNonce()>0)
+    {
+      written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_Nonce, sizeof(uint32_t));
+    }
+  if (m_interest->GetNack ()>0)
+    {
+        written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Nack);
+        written += Ccnb::EstimateNumber (m_interest->GetNack ());
+        written += 1;
+    }
+
+  written += 1; // </Interest>
+
+  return written;
+}
+
+class InterestVisitor : public CcnbParser::VoidDepthFirstVisitor
+{
+public:
+  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be CcnxInterest* */);
+};
+
+// We don't care about any other fields
+void
+InterestVisitor::visit (CcnbParser::Dtag &n, boost::any param/*should be Interest* */)
+{
+  // uint32_t n.m_dtag;
+  // std::list<Ptr<Block> > n.m_nestedBlocks;
+
+  static CcnbParser::NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
+  static CcnbParser::NameVisitor               nameVisitor;
+  static CcnbParser::TimestampVisitor          timestampVisitor;
+  static CcnbParser::Uint32tBlobVisitor        nonceVisitor;
+  
+  ndn::Interest &interest = *(boost::any_cast<ndn::Interest*> (param));
+
+  switch (n.m_dtag)
+    {
+    case CcnbParser::CCN_DTAG_Interest:
+      NS_LOG_DEBUG ("Interest");
+  
+      // process nested blocks
+      BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+        {
+          block->accept (*this, param);
+        }
+      break;
+    case CcnbParser::CCN_DTAG_Name:
+      {
+        NS_LOG_DEBUG ("Name");
+
+        // process name components
+        Ptr<Name> name = Create<Name> ();
+        
+        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+          {
+            block->accept (nameVisitor, &(*name));
+          }
+        interest.SetName (name);
+        break;
+      }
+    // case CcnbParser::CCN_DTAG_MinSuffixComponents:
+    //   NS_LOG_DEBUG ("MinSuffixComponents");
+    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+    //     throw CcnbParser::CcnbDecodingException ();
+    //   interest.SetMinSuffixComponents (
+    //            boost::any_cast<uint32_t> (
+    //                                       (*n.m_nestedTags.begin())->accept(
+    //                                                                        nonNegativeIntegerVisitor
+    //                                                                        )));
+    //   break;
+    // case CcnbParser::CCN_DTAG_MaxSuffixComponents:
+    //   NS_LOG_DEBUG ("MaxSuffixComponents");
+    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+    //     throw CcnbParser::CcnbDecodingException ();
+    //   interest.SetMaxSuffixComponents (
+    //            boost::any_cast<uint32_t> (
+    //                                       (*n.m_nestedTags.begin())->accept(
+    //                                                                        nonNegativeIntegerVisitor
+    //                                                                        )));
+    //   break;
+    // case CcnbParser::CCN_DTAG_Exclude:
+    //   {
+    //     NS_LOG_DEBUG ("Exclude");
+    //     // process exclude components
+    //     Ptr<Name> exclude = Create<Name> ();
+        
+    //     BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
+    //       {
+    //         block->accept (nameVisitor, &(*exclude));
+    //       }
+    //     interest.SetExclude (exclude);
+    //     break;
+    //   }
+    // case CcnbParser::CCN_DTAG_ChildSelector:
+    //   NS_LOG_DEBUG ("ChildSelector");
+    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+    //     throw CcnbParser::CcnbDecodingException ();
+
+    //   interest.SetChildSelector (
+    //            1 == boost::any_cast<uint32_t> (
+    //                                       (*n.m_nestedTags.begin())->accept(
+    //                                                                        nonNegativeIntegerVisitor
+    //                                                                        )));
+    //   break;
+    // case CCN_DTAG_AnswerOriginKind:
+    //   NS_LOG_DEBUG ("AnswerOriginKind");
+    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+    //     throw CcnbParser::CcnbDecodingException ();
+    //   interest.SetAnswerOriginKind (
+    //            1 == boost::any_cast<uint32_t> (
+    //                                       (*n.m_nestedTags.begin())->accept(
+    //                                                                        nonNegativeIntegerVisitor
+    //                                                                        )));
+    //   break;
+    case CcnbParser::CCN_DTAG_Scope: 
+      NS_LOG_DEBUG ("Scope");
+      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+        throw CcnbParser::CcnbDecodingException ();
+      interest.SetScope (
+               boost::any_cast<uint32_t> (
+                                          (*n.m_nestedTags.begin())->accept(
+                                                                           nonNegativeIntegerVisitor
+                                                                           )));
+      break;
+    case CcnbParser::CCN_DTAG_InterestLifetime:
+      NS_LOG_DEBUG ("InterestLifetime");
+      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+        throw CcnbParser::CcnbDecodingException ();
+
+      interest.SetInterestLifetime (
+               boost::any_cast<Time> (
+                                      (*n.m_nestedTags.begin())->accept(
+                                                                        timestampVisitor
+                                                                        )));
+      break;
+    case CcnbParser::CCN_DTAG_Nonce:
+      NS_LOG_DEBUG ("Nonce");
+      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+        throw CcnbParser::CcnbDecodingException ();
+
+      interest.SetNonce (
+               boost::any_cast<uint32_t> (
+                                          (*n.m_nestedTags.begin())->accept(
+                                                                           nonceVisitor
+                                                                           )));
+      break;
+    
+            
+    case CcnbParser::CCN_DTAG_Nack:
+      NS_LOG_DEBUG ("Nack");
+      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
+        throw CcnbParser::CcnbDecodingException ();
+            
+      interest.SetNack (
+               boost::any_cast<uint32_t> (
+                                          (*n.m_nestedTags.begin())->accept(nonNegativeIntegerVisitor)));
+      break;
+    }
+}
+
+
+uint32_t
+Interest::Deserialize (Buffer::Iterator start)
+{
+  static InterestVisitor interestVisitor;
+
+  Buffer::Iterator i = start;
+  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
+  root->accept (interestVisitor, GetPointer (m_interest));
+  
+  return i.GetDistanceFrom (start);
+}
+
+void
+Interest::Print (std::ostream &os) const
+{
+  os << "I: " << m_interest->GetName ();
+  
+  return;
+  // os << "<Interest>\n  <Name>" << GetName () << "</Name>\n";
+  // if (GetNack ()>0)
+  //   {
+  //     os << "  <NACK>";
+  //     switch (GetNack ())
+  //       {
+  //       case NACK_LOOP:
+  //         os << "loop";
+  //         break;
+  //       case NACK_CONGESTION:
+  //         os << "congestion";
+  //         break;
+  //       default:
+  //         os << "unknown";
+  //         break;
+  //       }
+  //     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";
+  // if ( !GetInterestLifetime ().IsZero() )
+  //   os << "  <InterestLifetime>" << GetInterestLifetime () << "</InterestLifetime>\n";
+  // if (GetNonce ()>0)
+  //   os << "  <Nonce>" << GetNonce () << "</Nonce>\n";
+  // os << "</Interest>";
+}
+
+} // ccnb
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb.cc b/model/wire/ccnb/wire-ccnb.cc
new file mode 100644
index 0000000..4f4f695
--- /dev/null
+++ b/model/wire/ccnb/wire-ccnb.cc
@@ -0,0 +1,213 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu> 
+ */
+
+#include "wire-ccnb.h"
+
+#include <sstream>
+#include <boost/foreach.hpp>
+#include "ccnb-parser/common.h"
+
+NDN_NAMESPACE_BEGIN
+
+namespace wire {
+
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+
+#define CCN_TT_BITS 3
+#define CCN_TT_MASK ((1 << CCN_TT_BITS) - 1)
+#define CCN_MAX_TINY ((1 << (7-CCN_TT_BITS)) - 1)
+#define CCN_TT_HBIT ((unsigned char)(1 << 7))
+
+size_t
+Ccnb::AppendBlockHeader (Buffer::Iterator &start, size_t val, uint32_t tt)
+{
+  unsigned char buf[1+8*((sizeof(val)+6)/7)];
+  unsigned char *p = &(buf[sizeof(buf)-1]);
+  size_t n = 1;
+  p[0] = (CCN_TT_HBIT & ~CcnbParser::CCN_CLOSE) |
+  ((val & CCN_MAX_TINY) << CCN_TT_BITS) |
+  (CCN_TT_MASK & tt);
+  val >>= (7-CCN_TT_BITS);
+  while (val != 0) {
+    (--p)[0] = (((unsigned char)val) & ~CCN_TT_HBIT) | CcnbParser::CCN_CLOSE;
+    n++;
+    val >>= 7;
+  }
+  start.Write (p,n);
+  return n;
+}
+
+size_t
+Ccnb::EstimateBlockHeader (size_t value)
+{
+  value >>= (7-CCN_TT_BITS);
+  size_t n = 1;
+  while (value>0)
+    {
+      value >>= 7;
+      n++;
+    }
+  return n;
+}
+
+size_t
+Ccnb::AppendNumber (Buffer::Iterator &start, uint32_t number)
+{
+  std::ostringstream os;
+  os << number;
+
+  size_t written = 0;
+  written += AppendBlockHeader (start, os.str().size(), CcnbParser::CCN_UDATA);
+  written += os.str().size();
+  start.Write (reinterpret_cast<const unsigned char*>(os.str().c_str()), os.str().size());
+
+  return written;
+}
+
+size_t
+Ccnb::EstimateNumber (uint32_t number)
+{
+  std::ostringstream os;
+  os << number;
+  return EstimateBlockHeader (os.str ().size ()) + os.str ().size ();
+}
+  
+size_t
+Ccnb::AppendCloser (Buffer::Iterator &start)
+{
+  start.WriteU8 (CcnbParser::CCN_CLOSE);
+  return 1;
+}
+
+size_t
+Ccnb::AppendName (Buffer::Iterator &start, const Name &name)
+{
+  size_t written = 0;
+  BOOST_FOREACH (const std::string &component, name.GetComponents())
+    {
+      written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Component,
+                                   reinterpret_cast<const uint8_t*>(component.c_str()), component.size());
+    }
+  return written;
+}
+
+size_t
+Ccnb::EstimateName (const Name &name)
+{
+  size_t written = 0;
+  BOOST_FOREACH (const std::string &component, name.GetComponents())
+    {
+      written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Component, component.size());
+    }
+  return written;
+}
+
+size_t
+Ccnb::AppendTimestampBlob (Buffer::Iterator &start, const Time &time)
+{
+  // the original function implements Markers... thought not sure what are these markers for...
+
+  // Determine miminal number of bytes required to store the timestamp
+  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
+  intmax_t ts = time.ToInteger (Time::S) >> 4;
+  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
+     required_bytes++;
+  
+  size_t len = AppendBlockHeader(start, required_bytes, CcnbParser::CCN_BLOB);
+
+  // write part with seconds
+  ts = time.ToInteger (Time::S) >> 4;
+  for (int i = 0; i < required_bytes - 2; i++)
+    start.WriteU8 ( ts >> (8 * (required_bytes - 3 - i)) );
+
+  /* arithmetic contortions are to avoid overflowing 31 bits */
+  ts = ((time.ToInteger (Time::S) & 15) << 12) +
+       (((time.ToInteger (Time::NS) % 1000000000) / 5 * 8 + 195312) / 390625);
+  for (int i = required_bytes - 2; i < required_bytes; i++)
+    start.WriteU8 ( ts >> (8 * (required_bytes - 1 - i)) );
+  
+  return len + required_bytes;
+}
+
+size_t
+Ccnb::EstimateTimestampBlob (const Time &time)
+{
+  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
+  intmax_t ts = time.ToInteger (Time::S) >> 4;
+  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
+     required_bytes++;
+
+  return EstimateBlockHeader (required_bytes) + required_bytes;
+}
+
+size_t
+Ccnb::AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag,
+                  const uint8_t *data, size_t size)
+{
+  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
+  /* 2 */
+  if (size>0)
+    {
+      written += AppendBlockHeader (start, size, CcnbParser::CCN_BLOB);
+      start.Write (data, size);
+      written += size;
+      /* size */
+    }
+  written += AppendCloser (start);
+  /* 1 */
+
+  return written;
+}
+
+size_t
+Ccnb::EstimateTaggedBlob (uint32_t dtag, size_t size)
+{
+  if (size>0)
+    return EstimateBlockHeader (dtag) + EstimateBlockHeader (size) + size + 1;
+  else
+    return EstimateBlockHeader (dtag) + 1;
+}
+
+size_t
+Ccnb::AppendString (Buffer::Iterator &start, uint32_t dtag,
+                                  const std::string &string)
+{
+  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
+  {
+    written += AppendBlockHeader (start, string.size (), CcnbParser::CCN_UDATA);
+    start.Write (reinterpret_cast<const uint8_t*> (string.c_str ()), string.size ());
+    written += string.size ();
+  }
+  written += AppendCloser (start);
+
+  return written;
+}
+
+size_t
+Ccnb::EstimateString (uint32_t dtag, const std::string &string)
+{
+  return EstimateBlockHeader (dtag) + EstimateBlockHeader (string.size ()) + string.size () + 1;
+}
+
+} // wire
+
+NDN_NAMESPACE_END
diff --git a/disabled/ndn-encoding-helper.h b/model/wire/ccnb/wire-ccnb.h
similarity index 73%
rename from disabled/ndn-encoding-helper.h
rename to model/wire/ccnb/wire-ccnb.h
index d28425c..42764c4 100644
--- a/disabled/ndn-encoding-helper.h
+++ b/model/wire/ccnb/wire-ccnb.h
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2011 University of California, Los Angeles
+ * Copyright (c) 2011-2013 University of California, Los Angeles
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -18,62 +18,36 @@
  * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
-#ifndef _NDN_ENCODING_HELPER_H_
-#define _NDN_ENCODING_HELPER_H_
+#ifndef NDN_WIRE_CCNB_SYNTAX_H
+#define NDN_WIRE_CCNB_SYNTAX_H
 
-#include <sys/types.h>
-
-#include "ccnb-parser/common.h"
 #include "ns3/ptr.h"
 #include "ns3/nstime.h"
 #include "ns3/buffer.h"
 
-namespace ns3 {
-namespace ndn {
+#include "ns3/ndn-common.h"
+#include "ns3/ndn-name.h"
 
-class Name;
-typedef Name NameComponents;
+NDN_NAMESPACE_BEGIN
 
-class Interest;
-class ContentObject;
-
-typedef Interest InterestHeader;
-typedef ContentObject ContentObjectHeader;
+namespace wire {
 
 /**
- * \brief Helper to encode/decode ccnb formatted Ndn message
+ * \brief Helper to encode CCNb blocks
  */
-class EncodingHelper
+class Ccnb
 {
 public:
   /**
-   * \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 Interest &interest);
-
-  /**
-   * \brief Compute the size of serialized NdnInterest
-   * @param interest Pointer to NdnInterest
-   * @return length 
-   */
-  static size_t
-  GetSerializedSize (const Interest &interest);
-  
-public:
-  /**
    * @brief Append CCNB block header
-   * @param start Buffer to store serialized NdnInterest
+   * @param start Buffer to store serialized
    * @param value dictionary id of the block header
    * @param block_type Type of CCNB block
    *
    * @returns written length
    */
   static size_t
-  AppendBlockHeader (Buffer::Iterator &start, size_t value, CcnbParser::ccn_tt block_type);
+  AppendBlockHeader (Buffer::Iterator &start, size_t value, uint32_t block_type);
 
   /**
    * @brief Estimate size of the CCNB block header
@@ -161,7 +135,7 @@
    * @returns written length
    */
   static size_t
-  AppendTaggedBlob (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag,
+  AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag,
                     const uint8_t *data, size_t size);
   
   /**
@@ -171,7 +145,7 @@
    * @returns estimated length
    */
   static size_t
-  EstimateTaggedBlob (CcnbParser::ccn_dtag dtag, size_t size);
+  EstimateTaggedBlob (uint32_t dtag, size_t size);
 
   /**
    * Append value as a tagged BLOB (templated version)
@@ -188,7 +162,7 @@
    */
   template<class T>
   static inline size_t
-  AppendTaggedBlob (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag, const T &data);
+  AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data);
 
   /**
    * Append a tagged string (should be a valid UTF-8 coded string)
@@ -202,7 +176,7 @@
    * @returns written length
    */
   static size_t
-  AppendString (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag,
+  AppendString (Buffer::Iterator &start, uint32_t dtag,
                 const std::string &string);
 
   /**
@@ -212,19 +186,19 @@
    * @returns estimated length
    */
   static size_t
-  EstimateString (CcnbParser::ccn_dtag dtag, const std::string &string);
-};
+  EstimateString (uint32_t dtag, const std::string &string);
+}; // Ccnb
 
 
 template<class T>
 size_t
-EncodingHelper::AppendTaggedBlob (Buffer::Iterator &start, CcnbParser::ccn_dtag dtag, const T &data)
+Ccnb::AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data)
 {
   return AppendTaggedBlob (start, dtag, reinterpret_cast<const uint8_t*> (&data), sizeof (data));
 }
 
-} // namespace ndn
-} // namespace ns3
+} // wire
 
-#endif // _NDN_ENCODING_HELPER_H_
+NDN_NAMESPACE_END
 
+#endif // NDN_WIRE_CCNB_SYNTAX_H
diff --git a/model/wire/ndnsim.h b/model/wire/ndnsim.h
index b46dba9..5e50a32 100644
--- a/model/wire/ndnsim.h
+++ b/model/wire/ndnsim.h
@@ -11,7 +11,7 @@
 #ifndef NDN_WIRE_NDNSIM_H
 #define NDN_WIRE_NDNSIM_H
 
-#include "../ndn-common.h"
+#include "ns3/ndn-common.h"
 #include "ns3/ndn-interest.h"
 #include "ns3/ndn-content-object.h"
 
diff --git a/wscript b/wscript
index eaa54c2..b33da18 100644
--- a/wscript
+++ b/wscript
@@ -127,6 +127,7 @@
 
         "apps/ndn-app.h",
 
+        "model/ndn-common.h",
         "model/ndn-l3-protocol.h",
         "model/ndn-face.h",
         "model/ndn-app-face.h",
@@ -149,6 +150,9 @@
         "model/fw/ndn-forwarding-strategy.h",
         "model/fw/ndn-fw-tag.h",
 
+        "model/wire/ndnsim.h",
+        "model/wire/ccnb.h",
+
         "utils/ndn-limits.h",
         "utils/ndn-rtt-estimator.h",
 
