diff --git a/ndn.cxx/blob.h b/ndn.cxx/blob.h
index f00d08e..4b488b3 100644
--- a/ndn.cxx/blob.h
+++ b/ndn.cxx/blob.h
@@ -16,16 +16,31 @@
 #include "ns3/ndn-common.h"
 
 #include <vector>
-#include <cstddef>
 
 NDN_NAMESPACE_BEGIN
 
 /**
  * @brief Class representing a general-use binary blob
  */
-class Blob : public std::vector<char>
+class Blob
 {
 public:
+  typedef std::vector<char> base;
+  
+  typedef base::value_type             value_type;
+  typedef base::pointer                pointer;
+  typedef base::const_pointer          const_pointer;
+  typedef base::reference              reference;
+  typedef base::const_reference        const_reference;
+  typedef base::iterator               iterator;
+  typedef base::const_iterator         const_iterator;
+  typedef base::const_reverse_iterator const_reverse_iterator;
+  typedef base::reverse_iterator       reverse_iterator;
+  typedef base::size_type              size_type;
+  typedef base::difference_type        difference_type;
+  typedef base::allocator_type         allocator_type;
+  
+public:
   /**
    * @brief Creates an empty blob
    */
@@ -33,8 +48,13 @@
   {
   }
 
+  Blob (const std::string &data)
+    : m_data (data.begin (), data.end ())
+  {
+  }
+
   Blob (const void *buf, size_t length)
-    : std::vector<char> (reinterpret_cast<const char*> (buf), reinterpret_cast<const char*> (buf) + length)
+    : m_data (reinterpret_cast<const char*> (buf), reinterpret_cast<const char*> (buf) + length)
   {
   }
   
@@ -44,7 +64,7 @@
   inline char*
   buf ()
   {
-    return &front ();
+    return &m_data.front ();
   }
 
   /**
@@ -53,10 +73,57 @@
   inline const char*
   buf () const
   {
-    return &front ();
+    return &m_data.front ();
   }
+
+  iterator begin () { return m_data.begin (); }
+  const_iterator begin () const { return m_data.begin (); }
+  iterator end () { return m_data.end (); }
+  const_iterator end () const { return m_data.end (); }
+  size_t size () const { return m_data.size (); }
+
+  void swap (Blob &x) { m_data.swap (x.m_data); }
+  void push_back (value_type val) { m_data.push_back (val); }
+
+  bool empty () const { return m_data.empty (); }
+
+  Blob &
+  operator = (const Blob &other) { m_data = other.m_data; return *this; }
+
+  reference operator [] (size_type pos) { return m_data [pos]; }
+  const_reference operator [] (size_type pos) const { return m_data [pos]; }
+
+  char getItem (size_type pos) const { return m_data [pos]; }
+
+  void clear () { m_data.clear (); }
+
+private:
+  friend bool operator == (const Blob &a, const Blob &b);
+  friend bool operator <  (const Blob &a, const Blob &b);
+  friend bool operator <= (const Blob &a, const Blob &b);
+  friend bool operator >  (const Blob &a, const Blob &b);
+  friend bool operator >= (const Blob &a, const Blob &b);
+
+private:
+  std::vector< char > m_data;
 };
 
+inline bool operator == (const Blob &a, const Blob &b)  { return a.m_data == b.m_data; }
+inline bool operator <  (const Blob &a, const Blob &b)  { return a.m_data <  b.m_data; }
+inline bool operator <= (const Blob &a, const Blob &b)  { return a.m_data <= b.m_data; }
+inline bool operator >  (const Blob &a, const Blob &b)  { return a.m_data >  b.m_data; }
+inline bool operator >= (const Blob &a, const Blob &b)  { return a.m_data >= b.m_data; }
+
 NDN_NAMESPACE_END
 
+#include <boost/functional/hash.hpp>
+namespace boost
+{
+inline std::size_t
+hash_value (const ns3::ndn::Blob v)
+{
+  return boost::hash_range (v.begin(), v.end());
+}
+}
+
 #endif // NDN_BLOB_H
diff --git a/ndn.cxx/exclude.cc b/ndn.cxx/exclude.cc
index 16c78bc..f8137eb 100644
--- a/ndn.cxx/exclude.cc
+++ b/ndn.cxx/exclude.cc
@@ -150,6 +150,11 @@
   return *this;
 }
 
+void
+Exclude::appendExclude (const name::Component &name, bool any)
+{
+  m_exclude.insert (std::make_pair (name, any));
+}
 
 std::ostream&
 operator << (std::ostream &os, const Exclude &exclude)
diff --git a/ndn.cxx/name-component.cc b/ndn.cxx/name-component.cc
index 8aa522c..084d6be 100644
--- a/ndn.cxx/name-component.cc
+++ b/ndn.cxx/name-component.cc
@@ -23,19 +23,19 @@
 
 Component::Component (const std::string &uri)
 {
-  copy (uri.begin (), uri.end (), back_inserter (*this));
+  copy (uri.begin (), uri.end (), std::back_inserter (*this));
 }
 
 Component::Component (std::string::const_iterator begin, std::string::const_iterator end)
 {
-  copy (begin, end, back_inserter (*this));
+  copy (begin, end, std::back_inserter (*this));
 }
 
 Component::Component (const void *buf, size_t length)
 {
   copy (static_cast<const char*> (buf),
         static_cast<const char*> (buf)+length,
-        back_inserter (*this));
+        std::back_inserter (*this));
 }
 
 Component &
@@ -43,7 +43,7 @@
 {
   try
     {
-      Uri::fromEscaped (uri.begin (), uri.end (), back_inserter (*this));
+      Uri::fromEscaped (uri.begin (), uri.end (), std::back_inserter (*this));
     }
   catch (error::Uri &err)
     {
@@ -61,7 +61,7 @@
 {
   try
     {
-      Uri::fromEscaped (begin, end, back_inserter (*this));
+      Uri::fromEscaped (begin, end, std::back_inserter (*this));
     }
   catch (error::Uri &err)
     {
diff --git a/ndn.cxx/name-component.h b/ndn.cxx/name-component.h
index e1b7296..7f523e0 100644
--- a/ndn.cxx/name-component.h
+++ b/ndn.cxx/name-component.h
@@ -11,11 +11,7 @@
 #ifndef NDN_NAME_COMPONENT_H
 #define NDN_NAME_COMPONENT_H
 
-#include <string>
-#include <vector>
-
 #include "blob.h"
-#include <stdint.h>
 
 NDN_NAMESPACE_BEGIN
 
@@ -24,7 +20,7 @@
 /**
  * @brief Class to representing binary blob of NDN name component
  *
- * This class is based on std::vector<char> and just provides several helpers
+ * This class is based on Blob (std::vector<char>) and just provides several helpers
  * to work with name components, as well as operator to apply canonical
  * ordering on name components
  */
@@ -290,8 +286,12 @@
 /**
  * @brief Stream output operator (output in escaped URI format)
  */
-std::ostream&
-operator <<(std::ostream &os, const Component &name);
+inline std::ostream&
+operator <<(std::ostream &os, const Component &name)
+{
+  name.toUri (os);
+  return os;
+}
 
 } // name
 
diff --git a/ndn.cxx/ndn-api-face.h b/ndn.cxx/ndn-api-face.h
index 4b88f51..78f482a 100644
--- a/ndn.cxx/ndn-api-face.h
+++ b/ndn.cxx/ndn-api-face.h
@@ -117,16 +117,7 @@
   ApiFacePriv *m_this;
 };
 
-
-/// @cond include_hidden
-#ifdef PYTHON_SCAN
-struct CallbackVoidNameInterest : public Callback<void, Ptr<const Name>, Ptr<const Interest> > { };
-struct CallbackVoidInterestContentObject : public Callback<void, Ptr<const Interest>, Ptr<const ContentObject> > { };
-struct CallbackVoidInterest : public Callback<void, Ptr<const Interest> > { };
-#endif
-/// @endcond
-
-}
-}
+} // ndn
+} // ns3
 
 #endif // NDN_API_HANDLER_H
