diff --git a/ndn-cpp/security/certificate.h b/ndn-cpp/security/certificate.h
deleted file mode 100644
index e0efa91..0000000
--- a/ndn-cpp/security/certificate.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_CERTIFICATE_H
-#define NDN_CERTIFICATE_H
-
-#include "ndn-cpp/data.h"
-
-namespace ndn {
-
-/**
- * @brief Class representing NDN identity
- *
- * - name
- *   - full NDN name of the NDN certificate
- *     - /ndn/ucla.edu/alex/cert/<pubkey.sha256>/<issuer>
- * - content
- *   - X.509 certificate in DER format (X.509 certificate can include any necessary identity information, as well as is fully extendable)
- *     - Subject: 
- *       - full real name, associated with the certificate
- *       - full affiliation, associated with the certificate
- *     - Subject Public Key Info
- *     - Validity
- * - signature
- *   - issuerCertName (KeyLocator/CertName)
- *     - /ndn/ucla.edu/cert/<pubkey.sha256>/<issuer>
- *
- */
-class Certificate : public Data
-{
-public:
-};
-
-} // ndn
-
-#endif // NDN_CERTIFICATE_H
diff --git a/ndn-cpp/security/identity.h b/ndn-cpp/security/identity.h
deleted file mode 100644
index 676b3b3..0000000
--- a/ndn-cpp/security/identity.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_IDENTITY_H
-#define NDN_IDENTITY_H
-
-namespace ndn {
-
-/**
- * @brief Class representing NDN identity
- *
- * - name 
- *   - (indexing and lookup)
- *   - /ndn/ucla.edu/alex
- * - contents
- *   - privateKeyName
- *     - unique name of the private key
- *     - private key bits are not exposed anywhere
- *     - /ndn/ucla.edu/alex/privKey/<pubkey.sha256>
- *   - indexed list of certificates
- *     - NDN DATA packets
- *     - easy access data structure of NDN certificate (“parsed DATA packet”)
- *   - link to default certificate
- *   - revocation list
- *     - one or more NDN DATA packets
- *     - name: <identity-name>/revocation-list/<version>(/<seqno>)?
- *       - /ndn/ucla.edu/alex/revocation-list/%FD...01
- *       - initially empty, updated whenever an issued certificate is getting revoked
- *     - revocation always exists
- *
- */
-class Identity
-{
-public:
-};
-
-} // ndn
-
-#endif // NDN_IDENTITY_H
diff --git a/ndn-cpp/security/keychain-pkcs12.cc b/ndn-cpp/security/keychain-pkcs12.cc
deleted file mode 100644
index 8a01fd5..0000000
--- a/ndn-cpp/security/keychain-pkcs12.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "keychain-pkcs12.h"
-
-namespace ndn {
-
-/////////////////////////////////////////////////////
-// interface to manage certificates and identities //
-/////////////////////////////////////////////////////
-
-Ptr<const Identity>
-KeychainKeystoreOpenssl::getDefaultIdentity ()
-{
-  return Ptr<const Identity> ();
-}
-
-Ptr<const Identity>
-KeychainKeystoreOpenssl::getIdentity (const Name &identityName)
-{
-  return Ptr<const Identity> ();
-}
-
-Ptr<const Identity>
-KeychainKeystoreOpenssl::generateIdentity (const Name &identityName)
-{
-  return Ptr<const Identity> ();
-}
-
-void
-KeychainKeystoreOpenssl::requestIdentityCertificate (const Identity &identity, std::ostream &os)
-{
-}
-
-Ptr<const Certificate>
-KeychainKeystoreOpenssl::issueCertificate (const Identity &identity, std::istream &is)
-{
-  return Ptr<const Certificate> ();
-}
-
-Ptr<const Certificate>
-KeychainKeystoreOpenssl::issueCertificate (std::istream &is)
-{
-  return Ptr<const Certificate> ();
-}
-
-void
-KeychainKeystoreOpenssl::installIdentityCertificate (const Certificate &cert)
-{
-}
-
-/////////////////////////////////////////////////////
-//       interface to sign and encrypt data        //
-/////////////////////////////////////////////////////
-Ptr<Signature>
-KeychainKeystoreOpenssl::sign (const Identity &identity, const void *buffer, size_t size)
-{
-  return Ptr<Signature> ();
-}
-
-
-} // ndn
diff --git a/ndn-cpp/security/keychain-pkcs12.h b/ndn-cpp/security/keychain-pkcs12.h
deleted file mode 100644
index 898d792..0000000
--- a/ndn-cpp/security/keychain-pkcs12.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_KEYCHAIN_PKCS12_H
-#define NDN_KEYCHAIN_PKCS12_H
-
-#include "keychain.h"
-#include "ndn-cpp/helpers/hash.h"
-
-namespace ndn
-{
-
-/**
- * @brief Class implementing logic to work with pkcs12 CCNx keystore file (.ccnx_keystore)
- */
-class KeychainKeystoreOpenssl : public virtual Keychain
-{
-public:
-  KeychainKeystoreOpenssl ();
-  KeychainKeystoreOpenssl (const std::string &path);
-
-public:
-  /////////////////////////////////////////////////////
-  // interface to manage certificates and identities //
-  /////////////////////////////////////////////////////
-
-  virtual Ptr<const Identity>
-  getDefaultIdentity ();
-
-  virtual Ptr<const Identity>
-  getIdentity (const Name &identityName);
-
-  virtual Ptr<const Identity>
-  generateIdentity (const Name &identityName);
-
-  virtual void
-  requestIdentityCertificate (const Identity &identity, std::ostream &os);
-
-  virtual Ptr<const Certificate>
-  issueCertificate (const Identity &identity, std::istream &is);
-
-  virtual Ptr<const Certificate>
-  issueCertificate (std::istream &is);
-
-  virtual void
-  installIdentityCertificate (const Certificate &cert);
-
-public:
-  /////////////////////////////////////////////////////
-  //       interface to sign and encrypt data        //
-  /////////////////////////////////////////////////////
-  virtual Ptr<Signature>
-  sign (const Identity &identity, const void *buffer, size_t size);
-
-  
-private:
-  void
-  initialize (const std::string &pkcs12);
-  
-private:
-  Name m_publicKeyName;
-  Hash m_publicKeyDigest;
-};
-  
-} // ndn
-
-#endif // NDN_KEYCHAIN_KEYSTORE_OPENSSL_H
diff --git a/ndn-cpp/security/keychain.cc b/ndn-cpp/security/keychain.cc
deleted file mode 100644
index 2f7fbe5..0000000
--- a/ndn-cpp/security/keychain.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "keychain.h"
-
-ndn::Keychain::~Keychain ()
-{
-}
diff --git a/ndn-cpp/security/keychain.h b/ndn-cpp/security/keychain.h
deleted file mode 100644
index 83a09dd..0000000
--- a/ndn-cpp/security/keychain.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_KEYCHAIN_H
-#define NDN_KEYCHAIN_H
-
-// #include "ndn-cpp/fields/blob.h"
-// #include "ndn-cpp/fields/name.h"
-
-#include "identity.h"
-#include "certificate.h"
-
-#include <iostream>
-
-namespace ndn {
-
-/**
- * @brief Interface for a keychain operations
- *
- * Keychain has the following set of operations:
- *
- * --- interface to manage certificates and identities
- *     - identities are permanently stored
- *     - certificates can be cached (or stored permanently, if user is willing to)
- * --- interface to sign and encrypt data
- *
- */
-class Keychain
-{
-public:
-  /**
-   * @brief Virtual destructor
-   */
-  virtual
-  ~Keychain ();
-
-  /////////////////////////////////////////////////////
-  // interface to manage certificates and identities //
-  /////////////////////////////////////////////////////
-
-  /**
-   * @brief Get default identity
-   */
-  virtual Ptr<const Identity>
-  getDefaultIdentity () = 0;
-
-  /**
-   * @brief Get identity by name
-   * @param identityName name of the requested identity
-   */
-  virtual Ptr<const Identity>
-  getIdentity (const Name &identityName) = 0;
-
-  /**
-   * @brief Create a self-certified identity
-   * @param identityName name of the identity to create
-   */
-  virtual Ptr<const Identity>
-  generateIdentity (const Name &identityName) = 0;
-
-  /**
-   * @brief Create identity certification request
-   * @param identity identity for which create the request
-   * @param os output stream which will receive the request
-   */
-  virtual void
-  requestIdentityCertificate (const Identity &identity, std::ostream &os) = 0;
-
-  /**
-   * @brief Issue a certificate using parameters from the input stream (formatted as request)
-   * @param identity Identity which will be used to issue the certificate
-   * @param is input stream from which to read parameters of the certificate
-   *
-   * @returns smart pointer to a signed certificate
-   */
-  virtual Ptr<const Certificate>
-  issueCertificate (const Identity &identity, std::istream &is) = 0;
-
-  /**
-   * @brief Issue a certificate using parameters from the input stream (formatted as request)
-   *
-   * Same as another version, but using the default identity
-   *
-   * @returns smart pointer to a signed certificate
-   */
-  virtual Ptr<const Certificate>
-  issueCertificate (std::istream &is) = 0;
-
-  /**
-   * @brief Install identity certificate
-   * @param cert certificate to install
-   */
-  virtual void
-  installIdentityCertificate (const Certificate &cert) = 0;
-
-public:
-  /////////////////////////////////////////////////////
-  //       interface to sign and encrypt data        //
-  /////////////////////////////////////////////////////
-
-  /**
-   * @brief Sign data using specified identity
-   * @param identity selected identity to sign data
-   * @param buffer pointer to the data to sign
-   * @param size length of data to sign
-   *
-   * @return pointer to base class of a signature object (depending on identity,
-   *         different types signature can be produced)
-   */
-  virtual Ptr<Signature>
-  sign (const Identity &identity, const void *buffer, size_t size) = 0;
-
-  // TBD
-  // /**
-  //  * @brief Decrypt data using the specified identity
-  //  */
-  // virtual ?
-  // decrypt (Ptr<Identity> identity, const void *buffer, size_t size, ?) = 0;
-};
-
-} // ndn
-
-#endif // NDN_KEYCHAIN_H
diff --git a/ndn-cpp/security/verifier.h b/ndn-cpp/security/verifier.h
deleted file mode 100644
index cb98243..0000000
--- a/ndn-cpp/security/verifier.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_VERIFIER_H
-#define NDN_VERIFIER_H
-
-namespace ndn {
-
-/**
- * @brief Interface for NDN DATA packet verification (trust model)
- *
- * --- interface to verify DATA packets
- *     - application selects required implementation
- *     - at least two build-in models:
- *       = hierarchical (default)
- *       = simple chain (without authorization)
- *     - uses NDN keychain as a backend to cache certificates
- */
-class Verifier
-{
-public:
-  /**
-   * @brief Virtual destructor
-   */
-  virtual
-  ~Verifier ();
-};
-
-} // ndn
-
-#endif // NDN_VERIFIER_H
diff --git a/ndn-cpp/trie/detail/functor-hook.h b/ndn-cpp/trie/detail/functor-hook.h
deleted file mode 100644
index f34969c..0000000
--- a/ndn-cpp/trie/detail/functor-hook.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 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 FUNCTOR_HOOK_H_
-#define FUNCTOR_HOOK_H_
-
-#include <boost/intrusive/parent_from_member.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-namespace detail {
-
-template<class BaseHook, class ValueType, int N>
-struct FunctorHook
-{
-  typedef typename BaseHook::template index<N>::type hook_type;
-  typedef hook_type*            hook_ptr;
-  typedef const hook_type*      const_hook_ptr;
-  
-  typedef ValueType             value_type;
-  typedef value_type*           pointer;
-  typedef const value_type*     const_pointer;
-  
-  //Required static functions
-  static hook_ptr to_hook_ptr (value_type &value)
-  {  return &value.policy_hook_.template get<N> (); }
-  
-  static const_hook_ptr to_hook_ptr(const value_type &value)
-  {  return &value.policy_hook_.template get<N> (); }
-  
-  static pointer to_value_ptr(hook_ptr n)
-  {
-    return
-      boost::intrusive::get_parent_from_member<value_type>
-      (static_cast<BaseHook*> (boost::intrusive::get_parent_from_member< wrap<hook_type> >(n, &wrap<hook_type>::value_)),
-       &value_type::policy_hook_);
-  }
-  static const_pointer to_value_ptr(const_hook_ptr n)
-  {
-    return
-      boost::intrusive::get_parent_from_member<value_type>
-      (static_cast<const BaseHook*> (boost::intrusive::get_parent_from_member< wrap<hook_type> >(n, &wrap<hook_type>::value_)),
-       &value_type::policy_hook_);
-  }
-};
-
-} // detail
-} // ndnSIM
-} // ndn
-} // ns3
-
-#endif // FUNCTOR_HOOK_H_
diff --git a/ndn-cpp/trie/detail/multi-policy-container.h b/ndn-cpp/trie/detail/multi-policy-container.h
deleted file mode 100644
index c1251e9..0000000
--- a/ndn-cpp/trie/detail/multi-policy-container.h
+++ /dev/null
@@ -1,175 +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 MULTI_POLICY_CONTAINER_H_
-#define MULTI_POLICY_CONTAINER_H_
-
-#include <boost/mpl/inherit_linearly.hpp>
-#include <boost/mpl/at.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-namespace detail {
-
-template< class Base, class Value >
-struct policy_wrap
-{
-  policy_wrap (Base &base) : value_ (base) { }
-  Value value_;
-};
-
-template< class Base, class Super/*empy_wrap/previous level*/, class Value/*policy_wrap< element in vector >*/ >
-struct inherit_with_base : Super, Value
-{
-  inherit_with_base (Base &base) : Super (base), Value (base) { }
-
-  void
-  update (typename Base::iterator item)
-  {
-    Value::value_.update (item);
-    Super::update (item);
-  }
-
-  bool
-  insert (typename Base::iterator item)
-  {
-    bool ok = Value::value_.insert (item);
-    if (!ok)
-      return false;
-
-    ok = Super::insert (item);
-    if (!ok)
-      {
-        Value::value_.erase (item);
-        return false;
-      }
-    return true;
-  }
-
-  void
-  lookup (typename Base::iterator item)
-  {
-    Value::value_.lookup (item);
-    Super::lookup (item);
-  }
-
-  void
-  erase (typename Base::iterator item)
-  {
-    Value::value_.erase (item);
-    Super::erase (item);
-  }  
-
-  void
-  clear ()
-  {
-    Value::value_.clear ();
-    Super::clear ();
-  }
-};
-
-template< class Base >
-struct empty_policy_wrap
-{
-  empty_policy_wrap (Base &base) { }
-
-  void update (typename Base::iterator item) {}
-  bool insert (typename Base::iterator item) { return true; }
-  void lookup (typename Base::iterator item) {}
-  void erase (typename Base::iterator item) {}
-  void clear () {}
-};
-
-template< class Base, class Vector >
-struct multi_policy_container
-  : public boost::mpl::fold< Vector,
-                      empty_policy_wrap<Base>,
-                      inherit_with_base<Base,
-                                        boost::mpl::_1/*empty/previous*/,
-                                        policy_wrap<Base, boost::mpl::_2>/*element in vector*/>
-                      >::type
-{
-  typedef typename boost::mpl::fold< Vector,
-                              empty_policy_wrap<Base>,
-                              inherit_with_base<Base,
-                                                boost::mpl::_1/*empty/previous*/,
-                                                policy_wrap<Base, boost::mpl::_2>/*element in vector*/>
-                              >::type super;
-
-  typedef typename boost::mpl::at_c<Vector, 0>::type::iterator iterator;
-  typedef typename boost::mpl::at_c<Vector, 0>::type::const_iterator const_iterator;
-
-  iterator begin ()             { return this->get<0> ().begin (); }
-  const_iterator begin () const { return this->get<0> ().begin (); }
-
-  iterator end ()             { return this->get<0> ().end (); }
-  const_iterator end () const { return this->get<0> ().end (); }
-
-  size_t size () const { return this->get<0> ().size (); }
-  
-  multi_policy_container (Base &base)
-  : super (base)
-  { }
-
-  template<int N>
-  struct index
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type type;
-  };
-  
-  template<class T>
-  T &
-  get ()
-  {
-    return static_cast< policy_wrap<Base, T> &> (*this).value_;
-  }
-
-  template<class T>
-  const T &
-  get () const
-  {
-    return static_cast< const policy_wrap<Base, T> &> (*this).value_;
-  }
-
-  template<int N>
-  typename boost::mpl::at_c<Vector, N>::type &
-  get ()
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type T;
-    return static_cast< policy_wrap<Base, T> &> (*this).value_;
-  }
-
-  template<int N>
-  const typename boost::mpl::at_c<Vector, N>::type &
-  get () const
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type T;
-    return static_cast< const policy_wrap<Base, T> &> (*this).value_;
-  }
-};
-
-
-} // detail
-} // ndnSIM
-} // ndn
-} // ns3
-
-#endif // MULTI_POLICY_CONTAINER_H_
diff --git a/ndn-cpp/trie/detail/multi-type-container.h b/ndn-cpp/trie/detail/multi-type-container.h
deleted file mode 100644
index d4971c4..0000000
--- a/ndn-cpp/trie/detail/multi-type-container.h
+++ /dev/null
@@ -1,86 +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 MULTI_TYPE_CONTAINER_H_
-#define MULTI_TYPE_CONTAINER_H_
-
-#include <boost/mpl/inherit_linearly.hpp>
-#include <boost/mpl/inherit.hpp>
-#include <boost/mpl/at.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-namespace detail {
-
-template <class T>
-struct wrap
-{
-  T value_;
-};
-
-template< class Vector >
-struct multi_type_container
-  : public boost::mpl::inherit_linearly< Vector, boost::mpl::inherit<wrap<boost::mpl::_2>, boost::mpl::_1 >
-  >::type
-{
-  template<int N>
-  struct index
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type type;
-  };
-  
-  template<class T>
-  T &
-  get ()
-  {
-    return static_cast< wrap<T> &> (*this).value_;
-  }
-
-  template<class T>
-  const T &
-  get () const
-  {
-    return static_cast< const wrap<T> &> (*this).value_;
-  }
-  
-  template<int N>
-  typename boost::mpl::at_c<Vector, N>::type &
-  get ()
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type T;
-    return static_cast< wrap<T> &> (*this).value_;
-  }
-
-  template<int N>
-  const typename boost::mpl::at_c<Vector, N>::type &
-  get () const
-  {
-    typedef typename boost::mpl::at_c<Vector, N>::type T;
-    return static_cast< const wrap<T> &> (*this).value_;
-  }
-};
-  
-} // detail
-} // ndnSIM
-} // ndn
-} // ns3
-
-#endif // MULTI_TYPE_CONTAINER_H_
diff --git a/ndn-cpp/trie/payload-traits/pointer.h b/ndn-cpp/trie/payload-traits/pointer.h
deleted file mode 100644
index 8290fbe..0000000
--- a/ndn-cpp/trie/payload-traits/pointer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_TRIE_PAYLOAD_TRAITS_POINTER_H
-#define NDN_TRIE_PAYLOAD_TRAITS_POINTER_H
-
-namespace ndn {
-namespace trie {
-
-template<typename Payload, typename BasePayload = Payload>
-struct pointer_payload_traits
-{
-  typedef Payload         payload_type; // general type of the payload
-  typedef Payload*        storage_type; // how the payload is actually stored
-  typedef Payload*        insert_type;  // what parameter is inserted
-
-  typedef Payload*        return_type;  // what is returned on access
-  typedef const Payload*  const_return_type; // what is returned on const access
-
-  typedef BasePayload*       base_type;       // base type of the entry (when implementation details need to be hidden)
-  typedef const BasePayload* const_base_type; // const base type of the entry (when implementation details need to be hidden)
-
-  static Payload* empty_payload;
-};
-
-template<typename Payload, typename BasePayload>
-Payload*
-pointer_payload_traits<Payload, BasePayload>::empty_payload = NULL;
-
-} // trie
-} // ndn
-
-#endif // NDN_TRIE_PAYLOAD_TRAITS_POINTER_H
diff --git a/ndn-cpp/trie/payload-traits/ptr.h b/ndn-cpp/trie/payload-traits/ptr.h
deleted file mode 100644
index 3caf020..0000000
--- a/ndn-cpp/trie/payload-traits/ptr.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_TRIE_PAYLOAD_TRAITS_PTR_H
-#define NDN_TRIE_PAYLOAD_TRAITS_PTR_H
-
-namespace ndn {
-namespace trie {
-
-template<typename Payload, typename BasePayload = Payload>
-struct ptr_payload_traits
-{
-  typedef Payload            payload_type;
-  typedef Ptr<Payload>       storage_type;
-  typedef Ptr<Payload>       insert_type;
-
-  typedef Ptr<Payload>       return_type;
-  typedef Ptr<const Payload> const_return_type;
-
-  typedef Ptr<BasePayload> base_type;
-  typedef Ptr<const BasePayload> const_base_type;
-
-  static Ptr<Payload> empty_payload;
-};
-
-template<typename Payload, typename BasePayload>
-Ptr<Payload>
-ptr_payload_traits<Payload, BasePayload>::empty_payload; // = Ptr<Payload> ();
-
-} // trie
-} // ndn
-
-#endif // NDN_TRIE_PAYLOAD_TRAITS_PTR_H
diff --git a/ndn-cpp/trie/policies/counting-policy.h b/ndn-cpp/trie/policies/counting-policy.h
deleted file mode 100644
index d27f915..0000000
--- a/ndn-cpp/trie/policies/counting-policy.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef COUNTING_POLICY_H_
-#define COUNTING_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for policy that just keeps track of number of elements
- * It's doing a rather expensive job, but just in case it needs to be extended later
- */
-struct counting_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Counting"; }
-
-  struct policy_hook_type : public boost::intrusive::list_member_hook<> {};
-
-  template<class Container>
-  struct container_hook
-  {
-    // could be class/struct implementation
-    typedef boost::intrusive::member_hook< Container,
-                             policy_hook_type,
-                             &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    typedef typename boost::intrusive::list< Container, Hook > policy_container;
-    
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : base_ (base)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        policy_container::push_back (*item);
-        return true;
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif // COUNTING_POLICY_H_
diff --git a/ndn-cpp/trie/policies/empty-policy.h b/ndn-cpp/trie/policies/empty-policy.h
deleted file mode 100644
index 0cfe962..0000000
--- a/ndn-cpp/trie/policies/empty-policy.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef EMPTY_POLICY_H_
-#define EMPTY_POLICY_H_
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for empty (bogus) replacement policy
- */
-struct empty_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return ""; }
-
-  typedef void* policy_hook_type;
-
-  template<class Container> struct container_hook { typedef void* type; };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    struct type
-    {
-      inline type (Base &base) {}
-      
-      inline void update (typename Container::iterator) { }
-      inline bool insert (typename Container::iterator) { return true; }
-      inline void lookup (typename Container::iterator item) { }
-      inline void erase (typename Container::iterator item) { }
-      inline void clear () { }
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif // EMPTY_POLICY_H_
diff --git a/ndn-cpp/trie/policies/fifo-policy.h b/ndn-cpp/trie/policies/fifo-policy.h
deleted file mode 100644
index 7acad2b..0000000
--- a/ndn-cpp/trie/policies/fifo-policy.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef FIFO_POLICY_H_
-#define FIFO_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for First In First Out replacement policy
- */
-struct fifo_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Fifo"; }
-
-  struct policy_hook_type : public boost::intrusive::list_member_hook<> {};
-
-  template<class Container>
-  struct container_hook
-  {
-    // could be class/struct implementation
-    typedef boost::intrusive::member_hook< Container,
-                             policy_hook_type,
-                             &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    typedef typename boost::intrusive::list< Container, Hook > policy_container;
-    
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : base_ (base)
-        , max_size_ (100)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        if (max_size_ != 0 && policy_container::size () >= max_size_)
-          {
-            base_.erase (&(*policy_container::begin ()));
-          }
-      
-        policy_container::push_back (*item);
-        return true;
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-      size_t max_size_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif
diff --git a/ndn-cpp/trie/policies/lfu-policy.h b/ndn-cpp/trie/policies/lfu-policy.h
deleted file mode 100644
index 802f64b..0000000
--- a/ndn-cpp/trie/policies/lfu-policy.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef LFU_POLICY_H_
-#define LFU_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/set.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for LFU replacement policy
- */
-struct lfu_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Lfu"; }
-
-  struct policy_hook_type : public boost::intrusive::set_member_hook<> { double frequency; };
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy
-  {
-    static double& get_order (typename Container::iterator item)
-    {
-      return static_cast<policy_hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->frequency;
-    }
-
-    static const double& get_order (typename Container::const_iterator item)
-    {
-      return static_cast<const policy_hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->frequency;
-    }
-
-    template<class Key>
-    struct MemberHookLess
-    {
-      bool operator () (const Key &a, const Key &b) const
-      {
-        return get_order (&a) < get_order (&b);
-      }
-    };
-
-    typedef boost::intrusive::multiset< Container,
-                                   boost::intrusive::compare< MemberHookLess< Container > >,
-                                   Hook > policy_container;
-
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef policy policy_base; // to get access to get_order methods from outside
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : base_ (base)
-        , max_size_ (100)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-        get_order (item) += 1;
-        policy_container::insert (*item);
-      }
-
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        get_order (item) = 0;
-
-        if (max_size_ != 0 && policy_container::size () >= max_size_)
-          {
-            // this erases the "least frequently used item" from cache
-            base_.erase (&(*policy_container::begin ()));
-          }
-
-        policy_container::insert (*item);
-        return true;
-      }
-
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-        get_order (item) += 1;
-        policy_container::insert (*item);
-      }
-
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-      size_t max_size_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif // LFU_POLICY_H
diff --git a/ndn-cpp/trie/policies/lru-policy.h b/ndn-cpp/trie/policies/lru-policy.h
deleted file mode 100644
index ad3a382..0000000
--- a/ndn-cpp/trie/policies/lru-policy.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef LRU_POLICY_H_
-#define LRU_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for Least Recently Used replacement policy
- */
-struct lru_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Lru"; }
-  
-  struct policy_hook_type : public boost::intrusive::list_member_hook<> {};
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    typedef typename boost::intrusive::list< Container, Hook > policy_container;
-    
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef Container parent_trie;
-    
-      type (Base &base)
-        : base_ (base)
-        , max_size_ (100)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do relocation
-        policy_container::splice (policy_container::end (),
-                                  *this,
-                                  policy_container::s_iterator_to (*item));
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        if (max_size_ != 0 && policy_container::size () >= max_size_)
-          {
-            base_.erase (&(*policy_container::begin ()));
-          }
-      
-        policy_container::push_back (*item);
-        return true;
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do relocation
-        policy_container::splice (policy_container::end (),
-                                  *this,
-                                  policy_container::s_iterator_to (*item));
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-      size_t max_size_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif
diff --git a/ndn-cpp/trie/policies/multi-policy.h b/ndn-cpp/trie/policies/multi-policy.h
deleted file mode 100644
index 739de7b..0000000
--- a/ndn-cpp/trie/policies/multi-policy.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef MULTI_POLICY_H_
-#define MULTI_POLICY_H_
-
-#include "detail/multi-type-container.h"
-#include "detail/multi-policy-container.h"
-#include "detail/functor-hook.h"
-
-#include <boost/mpl/size.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/range_c.hpp>
-#include <boost/mpl/transform.hpp>
-#include <boost/mpl/back_inserter.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/for_each.hpp>
-
-#include <boost/intrusive/options.hpp>
-
-namespace ndn {
-namespace trie {
-
-template<typename Policies> // e.g., mpl::vector1< lru_policy_traits >
-struct multi_policy_traits
-{
-  typedef Policies policy_traits;
-
-  struct getHook { template<class Item> struct apply { typedef typename Item::policy_hook_type type; }; };
-  typedef detail::multi_type_container< typename boost::mpl::transform1<policy_traits, getHook>::type > policy_hook_type;
-  
-  template<class Container>
-  struct container_hook
-  {
-    typedef policy_hook_type type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    typedef boost::mpl::range_c<int, 0, boost::mpl::size<policy_traits>::type::value> policies_range;
-
-    struct getPolicy
-    {
-      template<class Number>
-      struct apply
-      {
-        typedef
-        typename boost::mpl::at_c<policy_traits, Number::value>::type::
-        template policy<Base,
-                        Container,
-                        boost::intrusive::function_hook< detail::FunctorHook <Hook,
-                                                                              Container,
-                                                                              Number::value> > >::type
-        type;
-      };
-    };
-    
-    typedef
-    typename boost::mpl::transform1<policies_range,
-                                    getPolicy,
-                                    boost::mpl::back_inserter< boost::mpl::vector0<> > >::type policies;
-                             
-    
-    typedef detail::multi_policy_container< Base, policies > policy_container;
-    
-    class type : public policy_container
-    {
-    public:
-      typedef policy policy_base; // to get access to get_time methods from outside
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : policy_container (base)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        policy_container::update (item);
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        return policy_container::insert (item);
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        policy_container::lookup (item);
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (item);
-      }
-      
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      struct max_size_setter
-      {
-        max_size_setter (policy_container &container, size_t size) : m_container (container), m_size (size) { }
-        
-        template< typename U > void operator() (U index)
-        {
-          m_container.template get<U::value> ().set_max_size (m_size);
-        }
-
-      private:
-        policy_container &m_container;
-        size_t m_size;
-      };
-      
-      inline void
-      set_max_size (size_t max_size)
-      {
-        boost::mpl::for_each< boost::mpl::range_c<int, 0, boost::mpl::size<policy_traits>::type::value> >
-          (max_size_setter (*this, max_size));
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        // as max size should be the same everywhere, get the value from the first available policy
-        return policy_container::template get<0> ().get_max_size ();
-      }
-      
-    };
-  };
-
-
-  struct name_getter
-  {
-    name_getter (std::string &name) : m_name (name) { }
-    
-    template< typename U > void operator() (U index)
-    {
-      if (!m_name.empty ())
-        m_name += "::";
-      m_name += boost::mpl::at_c< policy_traits, U::value >::type::GetName ();
-    }
-
-    std::string &m_name;
-  };
-
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName ()
-  {
-    // combine names of all internal policies
-    std::string name;
-    boost::mpl::for_each< boost::mpl::range_c<int, 0, boost::mpl::size<policy_traits>::type::value> > (name_getter (name));
-    
-    return name;
-  }
-};
-
-} // trie
-} // ndn
-
-#endif // MULTI_POLICY_H_
diff --git a/ndn-cpp/trie/policies/persistent-policy.h b/ndn-cpp/trie/policies/persistent-policy.h
deleted file mode 100644
index d34f373..0000000
--- a/ndn-cpp/trie/policies/persistent-policy.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef PERSISTENT_POLICY_H_
-#define PERSISTENT_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for persistent replacement policy
- *
- * In this policy entries are added until there is a space (controlled by set_max_size call).
- * If maximum is reached, new entries will not be added and nothing will be removed from the container
- */
-struct persistent_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Persistent"; }
-
-  struct policy_hook_type : public boost::intrusive::list_member_hook<> {};
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    typedef typename boost::intrusive::list< Container, Hook > policy_container;
-    
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef Container parent_trie;
-    
-      type (Base &base)
-        : base_ (base)
-        , max_size_ (100) // when 0, policy is not enforced
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        if (max_size_ != 0 && policy_container::size () >= max_size_)
-          return false;
-      
-        policy_container::push_back (*item);
-        return true;
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-    private:
-      // type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-      size_t max_size_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif // PERSISTENT_POLICY_H_
diff --git a/ndn-cpp/trie/policies/random-policy.h b/ndn-cpp/trie/policies/random-policy.h
deleted file mode 100644
index d896e89..0000000
--- a/ndn-cpp/trie/policies/random-policy.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef RANDOM_POLICY_H_
-#define RANDOM_POLICY_H_
-
-#include "ns3/random-variable.h"
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/set.hpp>
-
-namespace ndn {
-namespace trie {
-
-/**
- * @brief Traits for random replacement policy
- */
-struct random_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (e.g., for logging)
-  static std::string GetName () { return "Random"; }
-
-  struct policy_hook_type : public boost::intrusive::set_member_hook<> { uint32_t randomOrder; };
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy 
-  {
-    static uint32_t& get_order (typename Container::iterator item)
-    {
-      return static_cast<typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->randomOrder;
-    }
-      
-    static const uint32_t& get_order (typename Container::const_iterator item)
-    {
-      return static_cast<const typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->randomOrder;
-    }
-    
-    template<class Key>
-    struct MemberHookLess
-    {
-      bool operator () (const Key &a, const Key &b) const
-      {
-        return get_order (&a) < get_order (&b);
-      }
-    };
-
-    typedef boost::intrusive::multiset< Container,
-                                   boost::intrusive::compare< MemberHookLess< Container > >,
-                                   Hook > policy_container;
-    
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef policy policy_base; // to get access to get_order methods from outside
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : base_ (base)
-        , u_rand (0, std::numeric_limits<uint32_t>::max ())
-        , max_size_ (100)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do nothing. it's random policy
-      }
-  
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        get_order (item) = u_rand.GetValue ();
-
-        if (max_size_ != 0 && policy_container::size () >= max_size_)
-          {
-            if (MemberHookLess<Container>() (*item, *policy_container::begin ()))
-              {
-                // std::cout << "Cannot add. Signaling fail\n";
-                // just return false. Indicating that insert "failed"
-                return false;
-              }
-            else
-              {
-                // removing some random element
-                base_.erase (&(*policy_container::begin ()));
-              }
-          }
-
-        policy_container::insert (*item);
-        return true;
-      }
-  
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing. it's random policy
-      }
-  
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-      
-    private:
-      Base &base_;
-      ns3::UniformVariable u_rand;
-      size_t max_size_;
-    };
-  };
-};
-
-} // trie
-} // ndn
-
-#endif // RANDOM_POLICY_H
diff --git a/ndn-cpp/trie/trie-with-policy.h b/ndn-cpp/trie/trie-with-policy.h
deleted file mode 100644
index 5a0d896..0000000
--- a/ndn-cpp/trie/trie-with-policy.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef TRIE_TRIE_WITH_POLICY_H_
-#define TRIE_TRIE_WITH_POLICY_H_
-
-#include "trie.h"
-
-namespace ndn {
-namespace trie {
-
-template<typename FullKey,
-         typename PayloadTraits,
-         typename PolicyTraits
-         >
-class trie_with_policy
-{
-public:
-  typedef trie< FullKey,
-                PayloadTraits,
-                typename PolicyTraits::policy_hook_type > parent_trie;
-
-  typedef typename parent_trie::iterator iterator;
-  typedef typename parent_trie::const_iterator const_iterator;
-  typedef typename parent_trie::payload_traits payload_traits;
-
-  typedef typename PolicyTraits::template policy<
-    trie_with_policy<FullKey, PayloadTraits, PolicyTraits>,
-    parent_trie,
-    typename PolicyTraits::template container_hook<parent_trie>::type >::type policy_container;
-
-  inline
-  trie_with_policy (size_t bucketSize = 10, size_t bucketIncrement = 10)
-    : trie_ ("", bucketSize, bucketIncrement)
-    , policy_ (*this)
-  {
-  }
-
-  inline std::pair< iterator, bool >
-  insert (const FullKey &key, typename PayloadTraits::insert_type payload)
-  {
-    std::pair<iterator, bool> item =
-      trie_.insert (key, payload);
-
-    if (item.second) // real insert
-      {
-        bool ok = policy_.insert (s_iterator_to (item.first));
-        if (!ok)
-          {
-            item.first->erase (); // cannot insert
-            return std::make_pair (end (), false);
-          }
-      }
-    else
-      {
-        return std::make_pair (s_iterator_to (item.first), false);
-      }
-
-    return item;
-  }
-
-  inline void
-  erase (const FullKey &key)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
-
-    if (!reachLast || lastItem->payload () == PayloadTraits::empty_payload)
-      return; // nothing to invalidate
-
-    erase (lastItem);
-  }
-
-  inline void
-  erase (iterator node)
-  {
-    if (node == end ()) return;
-
-    policy_.erase (s_iterator_to (node));
-    node->erase (); // will do cleanup here
-  }
-
-  inline void
-  clear ()
-  {
-    policy_.clear ();
-    trie_.clear ();
-  }
-
-  template<typename Modifier>
-  bool
-  modify (iterator position, Modifier mod)
-  {
-    if (position == end ()) return false;
-    if (position->payload () == PayloadTraits::empty_payload) return false;
-
-    mod (*position->payload ());
-    policy_.update (position);
-    return true;
-  }
-
-  /**
-   * @brief Find a node that has the exact match with the key
-   */
-  inline iterator
-  find_exact (const FullKey &key)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
-
-    if (!reachLast || lastItem->payload () == PayloadTraits::empty_payload)
-      return end ();
-
-    return lastItem;
-  }
-
-  /**
-   * @brief Find a node that has the longest common prefix with key (FIB/PIT lookup)
-   */
-  inline iterator
-  longest_prefix_match (const FullKey &key)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
-    if (foundItem != trie_.end ())
-      {
-        policy_.lookup (s_iterator_to (foundItem));
-      }
-    return foundItem;
-  }
-
-  /**
-   * @brief Find a node that has the longest common prefix with key (FIB/PIT lookup)
-   */
-  template<class Predicate>
-  inline iterator
-  longest_prefix_match_if (const FullKey &key, Predicate pred)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find_if (key, pred);
-    if (foundItem != trie_.end ())
-      {
-        policy_.lookup (s_iterator_to (foundItem));
-      }
-    return foundItem;
-  }
-
-  // /**
-  //  * @brief Const version of the longest common prefix match
-  //  * (semi-const, because there could be update of the policy anyways)
-  //  */
-  // inline const_iterator
-  // longest_prefix_match (const FullKey &key) const
-  // {
-  //   return static_cast<trie_with_policy*> (this)->longest_prefix_match (key);
-  // }
-
-  /**
-   * @brief Find a node that has prefix at least as the key (cache lookup)
-   */
-  inline iterator
-  deepest_prefix_match (const FullKey &key)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
-
-    // guard in case we don't have anything in the trie
-    if (lastItem == trie_.end ())
-      return trie_.end ();
-
-    if (reachLast)
-      {
-        if (foundItem == trie_.end ())
-          {
-            foundItem = lastItem->find (); // should be something
-          }
-        policy_.lookup (s_iterator_to (foundItem));
-        return foundItem;
-      }
-    else
-      { // couldn't find a node that has prefix at least as key
-        return trie_.end ();
-      }
-  }
-
-  /**
-   * @brief Find a node that has prefix at least as the key
-   */
-  template<class Predicate>
-  inline iterator
-  deepest_prefix_match (const FullKey &key, Predicate pred)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
-
-    // guard in case we don't have anything in the trie
-    if (lastItem == trie_.end ())
-      return trie_.end ();
-
-    if (reachLast)
-      {
-        foundItem = lastItem->find_if (pred); // may or may not find something
-        if (foundItem == trie_.end ())
-          {
-            return trie_.end ();
-          }
-        policy_.lookup (s_iterator_to (foundItem));
-        return foundItem;
-      }
-    else
-      { // couldn't find a node that has prefix at least as key
-        return trie_.end ();
-      }
-  }
-
-  iterator end () const
-  {
-    return 0;
-  }
-
-  const parent_trie &
-  getTrie () const { return trie_; }
-
-  parent_trie &
-  getTrie () { return trie_; }
-
-  const policy_container &
-  getPolicy () const { return policy_; }
-
-  policy_container &
-  getPolicy () { return policy_; }
-
-  static inline iterator
-  s_iterator_to (typename parent_trie::iterator item)
-  {
-    if (item == 0)
-      return 0;
-    else
-      return &(*item);
-  }
-
-private:
-  parent_trie      trie_;
-  mutable policy_container policy_;
-};
-
-} // trie
-} // ndn
-
-#endif // TRIE_TRIE_WITH_POLICY_H_
diff --git a/ndn-cpp/trie/trie.h b/ndn-cpp/trie/trie.h
deleted file mode 100644
index edc8a1b..0000000
--- a/ndn-cpp/trie/trie.h
+++ /dev/null
@@ -1,636 +0,0 @@
-/* -*- 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 LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_TRIE_TRIE_H_
-#define NDN_TRIE_TRIE_H_
-
-#include <boost/intrusive/unordered_set.hpp>
-#include <boost/intrusive/list.hpp>
-#include <boost/intrusive/set.hpp>
-#include <boost/functional/hash.hpp>
-#include <boost/interprocess/smart_ptr/unique_ptr.hpp>
-#include <boost/tuple/tuple.hpp>
-#include <boost/foreach.hpp>
-#include <boost/mpl/if.hpp>
-
-#include "payload-traits/pointer.h"
-#include "payload-traits/ptr.h"
-
-namespace ndn {
-namespace trie {
-
-////////////////////////////////////////////////////
-// forward declarations
-//
-template<typename FullKey,
-         typename PayloadTraits,
-         typename PolicyHook >
-class trie;
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-inline std::ostream&
-operator << (std::ostream &os,
-             const trie<FullKey, PayloadTraits, PolicyHook> &trie_node);
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-bool
-operator== (const trie<FullKey, PayloadTraits, PolicyHook> &a,
-            const trie<FullKey, PayloadTraits, PolicyHook> &b);
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook >
-std::size_t
-hash_value (const trie<FullKey, PayloadTraits, PolicyHook> &trie_node);
-
-///////////////////////////////////////////////////
-// actual definition
-//
-template<class T, class NonConstT>
-class trie_iterator;
-
-template<class T>
-class trie_point_iterator;
-
-template<typename FullKey,
-	 typename PayloadTraits,
-         typename PolicyHook >
-class trie
-{
-public:
-  typedef typename FullKey::partial_type Key;
-
-  typedef trie*       iterator;
-  typedef const trie* const_iterator;
-
-  typedef trie_iterator<trie, trie> recursive_iterator;
-  typedef trie_iterator<const trie, trie> const_recursive_iterator;
-
-  typedef trie_point_iterator<trie> point_iterator;
-  typedef trie_point_iterator<const trie> const_point_iterator;
-
-  typedef PayloadTraits payload_traits;
-
-  inline
-  trie (const Key &key, size_t bucketSize = 10, size_t bucketIncrement = 10)
-    : key_ (key)
-    , initialBucketSize_ (bucketSize)
-    , bucketIncrement_ (bucketIncrement)
-    , bucketSize_ (initialBucketSize_)
-    , buckets_ (new bucket_type [bucketSize_]) //cannot use normal pointer, because lifetime of buckets should be larger than lifetime of the container
-    , children_ (bucket_traits (buckets_.get (), bucketSize_))
-    , payload_ (PayloadTraits::empty_payload)
-    , parent_ (0)
-  {
-  }
-
-  inline
-  ~trie ()
-  {
-    payload_ = PayloadTraits::empty_payload; // necessary for smart pointers...
-    children_.clear_and_dispose (trie_delete_disposer ());
-  }
-
-  void
-  clear ()
-  {
-    children_.clear_and_dispose (trie_delete_disposer ());
-  }
-
-  template<class Predicate>
-  void
-  clear_if (Predicate cond)
-  {
-    recursive_iterator trieNode (this);
-    recursive_iterator end (0);
-
-    while (trieNode != end)
-      {
-        if (cond (*trieNode))
-          {
-            trieNode = recursive_iterator (trieNode->erase ());
-          }
-        trieNode ++;
-      }
-  }
-
-  // actual entry
-  friend bool
-  operator== <> (const trie<FullKey, PayloadTraits, PolicyHook> &a,
-                 const trie<FullKey, PayloadTraits, PolicyHook> &b);
-
-  friend std::size_t
-  hash_value <> (const trie<FullKey, PayloadTraits, PolicyHook> &trie_node);
-
-  inline std::pair<iterator, bool>
-  insert (const FullKey &key,
-          typename PayloadTraits::insert_type payload)
-  {
-    trie *trieNode = this;
-
-    BOOST_FOREACH (const Key &subkey, key)
-      {
-        typename unordered_set::iterator item = trieNode->children_.find (subkey);
-        if (item == trieNode->children_.end ())
-          {
-            trie *newNode = new trie (subkey, initialBucketSize_, bucketIncrement_);
-            // std::cout << "new " << newNode << "\n";
-            newNode->parent_ = trieNode;
-
-            if (trieNode->children_.size () >= trieNode->bucketSize_)
-              {
-                trieNode->bucketSize_ += trieNode->bucketIncrement_;
-                trieNode->bucketIncrement_ *= 2; // increase bucketIncrement exponentially
-
-                buckets_array newBuckets (new bucket_type [trieNode->bucketSize_]);
-                trieNode->children_.rehash (bucket_traits (newBuckets.get (), trieNode->bucketSize_));
-                trieNode->buckets_.swap (newBuckets);
-              }
-
-            std::pair< typename unordered_set::iterator, bool > ret =
-              trieNode->children_.insert (*newNode);
-
-            trieNode = &(*ret.first);
-          }
-        else
-          trieNode = &(*item);
-      }
-
-    if (trieNode->payload_ == PayloadTraits::empty_payload)
-      {
-        trieNode->payload_ = payload;
-        return std::make_pair (trieNode, true);
-      }
-    else
-      return std::make_pair (trieNode, false);
-  }
-
-  /**
-   * @brief Removes payload (if it exists) and if there are no children, prunes parents trie
-   */
-  inline iterator
-  erase ()
-  {
-    payload_ = PayloadTraits::empty_payload;
-    return prune ();
-  }
-
-  /**
-   * @brief Do exactly as erase, but without erasing the payload
-   */
-  inline iterator
-  prune ()
-  {
-    if (payload_ == PayloadTraits::empty_payload &&
-        children_.size () == 0)
-      {
-        if (parent_ == 0) return this;
-
-        trie *parent = parent_;
-        parent->children_.erase_and_dispose (*this, trie_delete_disposer ()); // delete this; basically, committing a suicide
-
-        return parent->prune ();
-      }
-    return this;
-  }
-
-  /**
-   * @brief Perform prune of the node, but without attempting to parent of the node
-   */
-  inline void
-  prune_node ()
-  {
-    if (payload_ == PayloadTraits::empty_payload &&
-        children_.size () == 0)
-      {
-        if (parent_ == 0) return;
-
-        trie *parent = parent_;
-        parent->children_.erase_and_dispose (*this, trie_delete_disposer ()); // delete this; basically, committing a suicide
-      }
-  }
-
-  // inline boost::tuple<const iterator, bool, const iterator>
-  // find (const FullKey &key) const
-  // {
-  //   return const_cast<trie*> (this)->find (key);
-  // }
-
-  /**
-   * @brief Perform the longest prefix match
-   * @param key the key for which to perform the longest prefix match
-   *
-   * @return ->second is true if prefix in ->first is longer than key
-   */
-  inline boost::tuple<iterator, bool, iterator>
-  find (const FullKey &key)
-  {
-    trie *trieNode = this;
-    iterator foundNode = (payload_ != PayloadTraits::empty_payload) ? this : 0;
-    bool reachLast = true;
-
-    BOOST_FOREACH (const Key &subkey, key)
-      {
-        typename unordered_set::iterator item = trieNode->children_.find (subkey);
-        if (item == trieNode->children_.end ())
-          {
-            reachLast = false;
-            break;
-          }
-        else
-          {
-            trieNode = &(*item);
-
-            if (trieNode->payload_ != PayloadTraits::empty_payload)
-              foundNode = trieNode;
-          }
-      }
-
-    return boost::make_tuple (foundNode, reachLast, trieNode);
-  }
-
-  /**
-   * @brief Perform the longest prefix match satisfying preficate
-   * @param key the key for which to perform the longest prefix match
-   *
-   * @return ->second is true if prefix in ->first is longer than key
-   */
-  template<class Predicate>
-  inline boost::tuple<iterator, bool, iterator>
-  find_if (const FullKey &key, Predicate pred)
-  {
-    trie *trieNode = this;
-    iterator foundNode = (payload_ != PayloadTraits::empty_payload) ? this : 0;
-    bool reachLast = true;
-
-    BOOST_FOREACH (const Key &subkey, key)
-      {
-        typename unordered_set::iterator item = trieNode->children_.find (subkey);
-        if (item == trieNode->children_.end ())
-          {
-            reachLast = false;
-            break;
-          }
-        else
-          {
-            trieNode = &(*item);
-
-            if (trieNode->payload_ != PayloadTraits::empty_payload &&
-                pred (trieNode->payload_))
-              {
-                foundNode = trieNode;
-              }
-          }
-      }
-
-    return boost::make_tuple (foundNode, reachLast, trieNode);
-  }
-
-  /**
-   * @brief Find next payload of the sub-trie
-   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration )
-   */
-  inline iterator
-  find ()
-  {
-    if (payload_ != PayloadTraits::empty_payload)
-      return this;
-
-    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
-    for (typename trie::unordered_set::iterator subnode = children_.begin ();
-         subnode != children_.end ();
-         subnode++ )
-      // BOOST_FOREACH (trie &subnode, children_)
-      {
-        iterator value = subnode->find ();
-        if (value != 0)
-          return value;
-      }
-
-    return 0;
-  }
-
-  /**
-   * @brief Find next payload of the sub-trie satisfying the predicate
-   * @param pred predicate
-   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration )
-   */
-  template<class Predicate>
-  inline const iterator
-  find_if (Predicate pred)
-  {
-    if (payload_ != PayloadTraits::empty_payload && pred (payload_))
-      return this;
-
-    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
-    for (typename trie::unordered_set::iterator subnode = children_.begin ();
-         subnode != children_.end ();
-         subnode++ )
-      // BOOST_FOREACH (const trie &subnode, children_)
-      {
-        iterator value = subnode->find_if (pred);
-        if (value != 0)
-          return value;
-      }
-
-    return 0;
-  }
-
-  iterator end ()
-  {
-    return 0;
-  }
-
-  const_iterator end () const
-  {
-    return 0;
-  }
-
-  typename PayloadTraits::const_return_type
-  payload () const
-  {
-    return payload_;
-  }
-
-  typename PayloadTraits::return_type
-  payload ()
-  {
-    return payload_;
-  }
-
-  void
-  set_payload (typename PayloadTraits::insert_type payload)
-  {
-    payload_ = payload;
-  }
-
-  Key key () const
-  {
-    return key_;
-  }
-
-  inline void
-  PrintStat (std::ostream &os) const;
-
-private:
-  //The disposer object function
-  struct trie_delete_disposer
-  {
-    void operator() (trie *delete_this)
-    {
-      delete delete_this;
-    }
-  };
-
-  template<class D>
-  struct array_disposer
-  {
-    void operator() (D *array)
-    {
-      delete [] array;
-    }
-  };
-
-  friend
-  std::ostream&
-  operator<< < > (std::ostream &os, const trie &trie_node);
-
-public:
-  PolicyHook policy_hook_;
-
-private:
-  boost::intrusive::unordered_set_member_hook<> unordered_set_member_hook_;
-
-  // necessary typedefs
-  typedef trie self_type;
-  typedef boost::intrusive::member_hook< trie,
-                                         boost::intrusive::unordered_set_member_hook< >,
-                                         &trie::unordered_set_member_hook_ > member_hook;
-
-  typedef boost::intrusive::unordered_set< trie, member_hook > unordered_set;
-  typedef typename unordered_set::bucket_type   bucket_type;
-  typedef typename unordered_set::bucket_traits bucket_traits;
-
-  template<class T, class NonConstT>
-  friend class trie_iterator;
-
-  template<class T>
-  friend class trie_point_iterator;
-
-  ////////////////////////////////////////////////
-  // Actual data
-  ////////////////////////////////////////////////
-
-  Key key_; ///< name component
-
-  size_t initialBucketSize_;
-  size_t bucketIncrement_;
-
-  size_t bucketSize_;
-  typedef boost::interprocess::unique_ptr< bucket_type, array_disposer<bucket_type> > buckets_array;
-  buckets_array buckets_;
-  unordered_set children_;
-
-  typename PayloadTraits::storage_type payload_;
-  trie *parent_; // to make cleaning effective
-};
-
-
-
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-inline std::ostream&
-operator << (std::ostream &os, const trie<FullKey, PayloadTraits, PolicyHook> &trie_node)
-{
-  os << "# " << trie_node.key_ << ((trie_node.payload_ != PayloadTraits::empty_payload)?"*":"") << std::endl;
-  typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
-
-  for (typename trie::unordered_set::const_iterator subnode = trie_node.children_.begin ();
-       subnode != trie_node.children_.end ();
-       subnode++ )
-  // BOOST_FOREACH (const trie &subnode, trie_node.children_)
-    {
-      os << "\"" << &trie_node << "\"" << " [label=\"" << trie_node.key_ << ((trie_node.payload_ != PayloadTraits::empty_payload)?"*":"") << "\"]\n";
-      os << "\"" << &(*subnode) << "\"" << " [label=\"" << subnode->key_ << ((subnode->payload_ != PayloadTraits::empty_payload)?"*":"") << "\"]""\n";
-
-      os << "\"" << &trie_node << "\"" << " -> " << "\"" << &(*subnode) << "\"" << "\n";
-      os << *subnode;
-    }
-
-  return os;
-}
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-inline void
-trie<FullKey, PayloadTraits, PolicyHook>
-::PrintStat (std::ostream &os) const
-{
-  os << "# " << key_ << ((payload_ != PayloadTraits::empty_payload)?"*":"") << ": " << children_.size() << " children" << std::endl;
-  for (size_t bucket = 0, maxbucket = children_.bucket_count ();
-       bucket < maxbucket;
-       bucket++)
-    {
-      os << " " << children_.bucket_size (bucket);
-    }
-  os << "\n";
-
-  typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
-  for (typename trie::unordered_set::const_iterator subnode = children_.begin ();
-       subnode != children_.end ();
-       subnode++ )
-  // BOOST_FOREACH (const trie &subnode, children_)
-    {
-      subnode->PrintStat (os);
-    }
-}
-
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-inline bool
-operator == (const trie<FullKey, PayloadTraits, PolicyHook> &a,
-             const trie<FullKey, PayloadTraits, PolicyHook> &b)
-{
-  return a.key_ == b.key_;
-}
-
-template<typename FullKey, typename PayloadTraits, typename PolicyHook>
-inline std::size_t
-hash_value (const trie<FullKey, PayloadTraits, PolicyHook> &trie_node)
-{
-  return boost::hash_value (trie_node.key_);
-}
-
-
-
-template<class Trie, class NonConstTrie> // hack for boost < 1.47
-class trie_iterator
-{
-public:
-  trie_iterator () : trie_ (0) {}
-  trie_iterator (typename Trie::iterator item) : trie_ (item) {}
-  trie_iterator (Trie &item) : trie_ (&item) {}
-
-  Trie & operator* () { return *trie_; }
-  const Trie & operator* () const { return *trie_; }
-  Trie * operator-> () { return trie_; }
-  const Trie * operator-> () const { return trie_; }
-  bool operator== (trie_iterator<const Trie, NonConstTrie> &other) const { return (trie_ == other.trie_); }
-  bool operator== (trie_iterator<Trie, NonConstTrie> &other) { return (trie_ == other.trie_); }
-  bool operator!= (trie_iterator<const Trie, NonConstTrie> &other) const { return !(*this == other); }
-  bool operator!= (trie_iterator<Trie, NonConstTrie> &other) { return !(*this == other); }
-
-  trie_iterator<Trie,NonConstTrie> &
-  operator++ (int)
-  {
-    if (trie_->children_.size () > 0)
-      trie_ = &(*trie_->children_.begin ());
-    else
-      trie_ = goUp ();
-    return *this;
-  }
-
-  trie_iterator<Trie,NonConstTrie> &
-  operator++ ()
-  {
-    (*this)++;
-    return *this;
-  }
-
-private:
-  typedef typename boost::mpl::if_< boost::is_same<Trie, NonConstTrie>,
-                                    typename Trie::unordered_set::iterator,
-                                    typename Trie::unordered_set::const_iterator>::type set_iterator;
-
-  Trie* goUp ()
-  {
-    if (trie_->parent_ != 0)
-      {
-        // typename Trie::unordered_set::iterator item =
-        set_iterator item = const_cast<NonConstTrie*>(trie_)->parent_->children_.iterator_to (const_cast<NonConstTrie&> (*trie_));
-        item++;
-        if (item != trie_->parent_->children_.end ())
-          {
-            return &(*item);
-          }
-        else
-          {
-            trie_ = trie_->parent_;
-            return goUp ();
-          }
-      }
-    else
-      return 0;
-  }
-private:
-  Trie *trie_;
-};
-
-
-template<class Trie>
-class trie_point_iterator
-{
-private:
-  typedef typename boost::mpl::if_< boost::is_same<Trie, const Trie>,
-                                    typename Trie::unordered_set::const_iterator,
-                                    typename Trie::unordered_set::iterator>::type set_iterator;
-
-public:
-  trie_point_iterator () : trie_ (0) {}
-  trie_point_iterator (typename Trie::iterator item) : trie_ (item) {}
-  trie_point_iterator (Trie &item)
-  {
-    if (item.children_.size () != 0)
-      trie_ = &*item.children_.begin ();
-    else
-      trie_ = 0;
-  }
-
-  Trie & operator* () { return *trie_; }
-  const Trie & operator* () const { return *trie_; }
-  Trie * operator-> () { return trie_; }
-  const Trie * operator-> () const { return trie_; }
-  bool operator== (trie_point_iterator<const Trie> &other) const { return (trie_ == other.trie_); }
-  bool operator== (trie_point_iterator<Trie> &other) { return (trie_ == other.trie_); }
-  bool operator!= (trie_point_iterator<const Trie> &other) const { return !(*this == other); }
-  bool operator!= (trie_point_iterator<Trie> &other) { return !(*this == other); }
-
-  trie_point_iterator<Trie> &
-  operator++ (int)
-  {
-    if (trie_->parent_ != 0)
-      {
-        set_iterator item = trie_->parent_->children_.iterator_to (*trie_);
-        item ++;
-        if (item == trie_->parent_->children_.end ())
-          trie_ = 0;
-        else
-          trie_ = &*item;
-      }
-    else
-      {
-        trie_ = 0;
-      }
-    return *this;
-  }
-
-  trie_point_iterator<Trie> &
-  operator++ ()
-  {
-    (*this)++;
-    return *this;
-  }
-
-private:
-  Trie *trie_;
-};
-
-
-} // trie
-} // ndn
-
-#endif // NDN_TRIE_TRIE_H_
