diff --git a/helper/ccnx-coding-helper.cc b/helper/ccnx-coding-helper.cc
index 6899543..7cab398 100644
--- a/helper/ccnx-coding-helper.cc
+++ b/helper/ccnx-coding-helper.cc
@@ -25,6 +25,7 @@
 #include "ns3/ccnx-content-object-header.h"
 
 #include <sstream>
+#include <boost/foreach.hpp>
 
 namespace ns3 {
 
@@ -75,9 +76,15 @@
 }
 
 size_t
-CcnxCodingHelper::AppendName (Buffer::Iterator start, const Name::Components &name)
+CcnxCodingHelper::AppendNameComponents (Buffer::Iterator start, const Name::Components &name)
 {
-  return 0;
+  size_t written = 0;
+  BOOST_FOREACH (const std::string &component, name.GetComponents())
+    {
+      written += AppendTaggedBlob (start, CCN_DTAG_Component,
+                                   reinterpret_cast<const uint8_t*>(component.c_str()), component.size());
+    }
+  return written;
 }
 
 size_t
@@ -130,7 +137,7 @@
   written += AppendBlockHeader (start, CCN_DTAG_Interest, CCN_DTAG); // <Interest>
   
   written += AppendBlockHeader (start, CCN_DTAG_Name, CCN_DTAG); // <Name>
-  written += AppendName (start, interest.GetName());                // <Component>...</Component>...
+  written += AppendNameComponents (start, interest.GetName());                // <Component>...</Component>...
   written += AppendCloser (start);                               // </Name>
 
   if (interest.GetMinSuffixComponents() >= 0)
@@ -148,7 +155,7 @@
   if (interest.GetExclude().size() > 0)
     {
       written += AppendBlockHeader (start, CCN_DTAG_Exclude, CCN_DTAG); // <Exclude>
-      written += AppendName (start, interest.GetExclude());                // <Component>...</Component>...
+      written += AppendNameComponents (start, interest.GetExclude());                // <Component>...</Component>...
       written += AppendCloser (start);                                  // </Exclude>
     }
   if (interest.IsEnabledChildSelector())
@@ -201,7 +208,9 @@
   written += AppendTaggedBlob (start, CCN_DTAG_SignatureBits, 0, 0);      // <SignatureBits />
   written += AppendCloser (start);                                    // </Signature>  
 
-  written += AppendName (start, contentObject.GetName()); // <Name><Component>...</Component>...</Name>
+  written += AppendBlockHeader (start, CCN_DTAG_Name, CCN_DTAG);    // <Name>
+  written += AppendNameComponents (start, contentObject.GetName()); //   <Component>...</Component>...
+  written += AppendCloser (start);                                  // </Name>  
 
   // fake signature
   written += AppendBlockHeader (start, CCN_DTAG_SignedInfo, CCN_DTAG); // <SignedInfo>
diff --git a/helper/ccnx-coding-helper.h b/helper/ccnx-coding-helper.h
index 3cafcbc..2d46a14 100644
--- a/helper/ccnx-coding-helper.h
+++ b/helper/ccnx-coding-helper.h
@@ -207,7 +207,7 @@
   AppendCloser (Buffer::Iterator start);
 
   static size_t
-  AppendName (Buffer::Iterator start, const Name::Components &name);
+  AppendNameComponents (Buffer::Iterator start, const Name::Components &name);
 
   /**
    * Append a binary timestamp as a BLOB using the ccn binary
diff --git a/model/ccnx-content-object-header.cc b/model/ccnx-content-object-header.cc
index 46a1554..a3852a2 100644
--- a/model/ccnx-content-object-header.cc
+++ b/model/ccnx-content-object-header.cc
@@ -22,6 +22,7 @@
 #include "ccnx-content-object-header.h"
 
 #include "ns3/log.h"
+#include "ns3/ccnx-coding-helper.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxContentObjectHeader");
 
@@ -60,19 +61,22 @@
 uint32_t
 CcnxContentObjectHeader::GetSerializedSize (void) const
 {
-  return 0;
+  // Unfortunately, two serializations are required, unless we can pre-calculate header length... which is not trivial
+  Buffer tmp;
+  
+  return CcnxCodingHelper::Serialize (tmp.Begin(), *this);
 }
     
 void
 CcnxContentObjectHeader::Serialize (Buffer::Iterator start) const
 {
-  return;
+  CcnxCodingHelper::Serialize (start, *this);
 }
 
 uint32_t
 CcnxContentObjectHeader::Deserialize (Buffer::Iterator start)
 {
-  return 0;
+  return 0; // the most complicated part is here
 }
   
 TypeId
diff --git a/model/ccnx-interest-header.cc b/model/ccnx-interest-header.cc
index 627946c..cab33ea 100644
--- a/model/ccnx-interest-header.cc
+++ b/model/ccnx-interest-header.cc
@@ -26,6 +26,7 @@
 #include "ccnx-interest-header.h"
 
 #include "ns3/log.h"
+#include "ns3/ccnx-coding-helper.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxInterestHeader");
 
@@ -167,19 +168,22 @@
 uint32_t
 CcnxInterestHeader::GetSerializedSize (void) const
 {
-  return 0;
+  // unfortunately, 2 serialization required...
+  Buffer tmp;
+  
+  return CcnxCodingHelper::Serialize (tmp.Begin(), *this);
 }
     
 void
 CcnxInterestHeader::Serialize (Buffer::Iterator start) const
 {
-  return;
+  CcnxCodingHelper::Serialize (start, *this);
 }
 
 uint32_t
 CcnxInterestHeader::Deserialize (Buffer::Iterator start)
 {
-  return 0;
+  return 0; // the most complicated part is here
 }
 
 TypeId
@@ -191,7 +195,23 @@
 void
 CcnxInterestHeader::Print (std::ostream &os) const
 {
-  os << "Interest: " << *m_name;
+  os << "<Interest><Name>" << *m_name << "</Name>";
+  if (m_minSuffixComponents>=0)
+    os << "<MinSuffixComponents>" << m_minSuffixComponents << "</MinSuffixComponents>";
+  if (m_maxSuffixComponents>=0)
+    os << "<MaxSuffixComponents>" << m_maxSuffixComponents << "</MaxSuffixComponents>";
+  if (m_exclude->size()>0)
+    os << "<Exclude>" << *m_exclude << "</Exclude>";
+  if (m_childSelector)
+    os << "<ChildSelector />";
+  if (m_answerOriginKind)
+    os << "<AnswerOriginKind />";
+  if (m_scope>=0)
+    os << "<Scope>" << m_scope << "</Scope>";
+  if (!m_interestLifetime.IsZero())
+    os << "<InterestLifetime>" << m_interestLifetime << "</InterestLifetime>";
+  if (m_nonce>0)
+    os << "<Nonce>" << m_nonce << "</Nonce>";
 }
 
 }
diff --git a/model/name-components.cc b/model/name-components.cc
index 55e57c4..e1af1ee 100644
--- a/model/name-components.cc
+++ b/model/name-components.cc
@@ -20,9 +20,6 @@
 
 #include "name-components.h"
 
-#include "ns3/ccn.h"
-#include "ns3/ccn_charbuf.h"
-
 #include <iostream>
 
 using namespace std;
@@ -49,6 +46,13 @@
   // ccn_charbuf_destroy(&m_value);
 }
 
+const std::list<std::string> &
+Components::GetComponents () const
+{
+  return m_prefix;
+}
+
+  
 // const ccn_charbuf*
 // Components::GetName () const
 // {
diff --git a/model/name-components.h b/model/name-components.h
index 8c124f8..d9b3f0a 100644
--- a/model/name-components.h
+++ b/model/name-components.h
@@ -37,6 +37,9 @@
   ~Components ();
   
   Components& operator () (const std::string &s);
+
+  const std::list<std::string> &
+  GetComponents () const;
   
   // virtual uint32_t
   // GetSerializedSize (void) const;
diff --git a/wscript b/wscript
index e169e72..8f210c6 100644
--- a/wscript
+++ b/wscript
@@ -3,18 +3,38 @@
 import os
 import Logs
 import Utils
+import Options
+
+def set_options(opt):
+    opt.tool_options('boost')
+
+def configure(conf):
+    conf.check_tool('boost')
+    conf.env['BOOST'] = conf.check_boost(lib = '', # need only base
+                                         min_version='1.40.0' )
+    if not conf.env['BOOST']:
+        conf.report_optional_feature("ndn-abstract", "NDN abstraction", False,
+                                     "Required boost libraries not found")
+        conf.env['ENABLE_NDN_ABSTRACT']=False;
+        return
+    
+    conf.env['ENABLE_NDN_ABSTRACT']=True;
+
 
 def build(bld):
     module = bld.create_ns3_module ('NDNabstraction', ['applications', 'core', 'network', 'point-to-point'])
-    module.find_sources_in_dirs (['model', 'apps', 'helper'],[],['.cc']);
-
     tests = bld.create_ns3_module_test_library('NDNabstraction')
-    tests.find_sources_in_dirs( ['test'], [], ['.cc'] );
-
     headers = bld.new_task_gen('ns3header')
     headers.module = 'NDNabstraction'
+
+    if not bld.env['ENABLE_NDN_ABSTRACT']:
+        return
+   
+    module.find_sources_in_dirs (['model', 'apps', 'helper'],[],['.cc']);
+    tests.find_sources_in_dirs( ['test'], [], ['.cc'] );
     headers.find_sources_in_dirs( ['model', 'apps', 'helper'], [], ['.h'] );
 
+
     for path in ["examples"]:
         anode = bld.path.find_dir (path)
         if not anode or not anode.is_child_of(bld.srcnode):
