model: Remove deprecated "old" content store policies

Use policies and policy interface provided by NFD

Change-Id: I6d4b06225114d1680c9ff3c17b2616298959b0dc
diff --git a/utils/tracers/ndn-cs-tracer.cpp b/utils/tracers/ndn-cs-tracer.cpp
index ded69fe..e58a005 100644
--- a/utils/tracers/ndn-cs-tracer.cpp
+++ b/utils/tracers/ndn-cs-tracer.cpp
@@ -25,7 +25,6 @@
 #include "ns3/callback.h"
 
 #include "apps/ndn-app.hpp"
-#include "model/cs/ndn-content-store.hpp"
 #include "ns3/simulator.h"
 #include "ns3/node-list.h"
 #include "ns3/log.h"
@@ -200,9 +199,10 @@
 void
 CsTracer::Connect()
 {
-  Ptr<ContentStore> cs = m_nodePtr->GetObject<ContentStore>();
-  cs->TraceConnectWithoutContext("CacheHits", MakeCallback(&CsTracer::CacheHits, this));
-  cs->TraceConnectWithoutContext("CacheMisses", MakeCallback(&CsTracer::CacheMisses, this));
+  // // @TODO Do the same with NFD content store...
+  // Ptr<ContentStore> cs = m_nodePtr->GetObject<ContentStore>();
+  // cs->TraceConnectWithoutContext("CacheHits", MakeCallback(&CsTracer::CacheHits, this));
+  // cs->TraceConnectWithoutContext("CacheMisses", MakeCallback(&CsTracer::CacheMisses, this));
 
   Reset();
 }
diff --git a/utils/trie/aggregate-stats-policy.hpp b/utils/trie/aggregate-stats-policy.hpp
deleted file mode 100644
index 4d2673b..0000000
--- a/utils/trie/aggregate-stats-policy.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef AGGREGATE_STATS_POLICY_H_
-#define AGGREGATE_STATS_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/// @cond include_hidden
-
-/**
- * @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 aggregate_stats_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
-  static std::string
-  GetName()
-  {
-    return "AggregateStats";
-  }
-  struct policy_hook_type {
-  };
-
-  template<class Container>
-  struct container_hook {
-    struct 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:
-      typedef Container parent_trie;
-
-      type(Base& base)
-        : base_(base)
-        , m_updates(0)
-        , m_inserts(0)
-        , m_lookups(0)
-        , m_erases(0)
-      {
-      }
-
-      inline void
-      update(typename parent_trie::iterator item)
-      {
-        m_updates++;
-        // do nothing
-      }
-
-      inline bool
-      insert(typename parent_trie::iterator item)
-      {
-        m_inserts++;
-        return true;
-      }
-
-      inline void
-      lookup(typename parent_trie::iterator item)
-      {
-        m_lookups++;
-      }
-
-      inline void
-      erase(typename parent_trie::iterator item)
-      {
-        m_erases++;
-      }
-
-      inline void set_max_size(uint32_t)
-      {
-      }
-
-      inline uint32_t
-      get_max_size() const
-      {
-        return 0;
-      }
-
-      inline void
-      clear()
-      {
-        // is called only at the end of simulation
-      }
-
-      inline void
-      ResetStats()
-      {
-        m_updates = 0;
-        m_inserts = 0;
-        m_lookups = 0;
-        m_erases = 0;
-      }
-
-      inline uint64_t
-      GetUpdates() const
-      {
-        return m_updates;
-      }
-
-      inline uint64_t
-      GetInserts() const
-      {
-        return m_inserts;
-      }
-
-      inline uint64_t
-      GetLookups() const
-      {
-        return m_lookups;
-      }
-
-      inline uint64_t
-      GetErases() const
-      {
-        return m_erases;
-      }
-
-    private:
-      type()
-        : base_(*((Base*)0)){};
-
-    private:
-      Base& base_;
-
-      uint64_t m_updates;
-      uint64_t m_inserts;
-      uint64_t m_lookups;
-      uint64_t m_erases;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // AGGREGATE_STATS_POLICY_H_
diff --git a/utils/trie/counting-policy.hpp b/utils/trie/counting-policy.hpp
deleted file mode 100644
index 71331b7..0000000
--- a/utils/trie/counting-policy.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef COUNTING_POLICY_H_
-#define COUNTING_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @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 (for NS-3 object model and 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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // COUNTING_POLICY_H_
diff --git a/utils/trie/detail/functor-hook.hpp b/utils/trie/detail/functor-hook.hpp
deleted file mode 100644
index 17542ba..0000000
--- a/utils/trie/detail/functor-hook.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef FUNCTOR_HOOK_H_
-#define FUNCTOR_HOOK_H_
-
-/// @cond include_hidden
-
-#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
-
-/// @endcond
-
-#endif // FUNCTOR_HOOK_H_
diff --git a/utils/trie/detail/multi-policy-container.hpp b/utils/trie/detail/multi-policy-container.hpp
deleted file mode 100644
index 5c3450b..0000000
--- a/utils/trie/detail/multi-policy-container.hpp
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef MULTI_POLICY_CONTAINER_H_
-#define MULTI_POLICY_CONTAINER_H_
-
-/// @cond include_hidden
-
-#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
-
-/// @endcond
-
-#endif // MULTI_POLICY_CONTAINER_H_
diff --git a/utils/trie/detail/multi-type-container.hpp b/utils/trie/detail/multi-type-container.hpp
deleted file mode 100644
index 5f65aa3..0000000
--- a/utils/trie/detail/multi-type-container.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef MULTI_TYPE_CONTAINER_H_
-#define MULTI_TYPE_CONTAINER_H_
-
-/// @cond include_hidden
-
-#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
-
-/// @endcond include_hidden
-
-#endif // MULTI_TYPE_CONTAINER_H_
diff --git a/utils/trie/empty-policy.hpp b/utils/trie/empty-policy.hpp
deleted file mode 100644
index 237a647..0000000
--- a/utils/trie/empty-policy.hpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef EMPTY_POLICY_H_
-#define EMPTY_POLICY_H_
-
-/// @cond include_hidden
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for empty (bogus) replacement policy
- */
-struct empty_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and 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()
-      {
-      }
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // EMPTY_POLICY_H_
diff --git a/utils/trie/fifo-policy.hpp b/utils/trie/fifo-policy.hpp
deleted file mode 100644
index 44f335e..0000000
--- a/utils/trie/fifo-policy.hpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef FIFO_POLICY_H_
-#define FIFO_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for First In First Out replacement policy
- */
-struct fifo_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and 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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif
diff --git a/utils/trie/lfu-policy.hpp b/utils/trie/lfu-policy.hpp
deleted file mode 100644
index 6234961..0000000
--- a/utils/trie/lfu-policy.hpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef LFU_POLICY_H_
-#define LFU_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/set.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for LFU replacement policy
- */
-struct lfu_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and 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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // LFU_POLICY_H
diff --git a/utils/trie/lru-policy.hpp b/utils/trie/lru-policy.hpp
deleted file mode 100644
index a88b0f7..0000000
--- a/utils/trie/lru-policy.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef LRU_POLICY_H_
-#define LRU_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for Least Recently Used replacement policy
- */
-struct lru_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and 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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif
diff --git a/utils/trie/multi-policy.hpp b/utils/trie/multi-policy.hpp
deleted file mode 100644
index 01c8951..0000000
--- a/utils/trie/multi-policy.hpp
+++ /dev/null
@@ -1,196 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef MULTI_POLICY_H_
-#define MULTI_POLICY_H_
-
-/// @cond include_hidden
-
-#include "detail/multi-type-container.hpp"
-#include "detail/multi-policy-container.hpp"
-#include "detail/functor-hook.hpp"
-
-#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 ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-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 (for NS-3 object model and 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;
-  }
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // MULTI_POLICY_H_
diff --git a/utils/trie/payload-policy.hpp b/utils/trie/payload-policy.hpp
deleted file mode 100644
index 6df4e7c..0000000
--- a/utils/trie/payload-policy.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef PAYLOAD_POLICY_H_
-#define PAYLOAD_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for policy that keeps items in a sorted order using payload member
- */
-template<class Member>
-struct payload_policy_traits {
-  struct policy_hook_type : public boost::intrusive::set_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 (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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // PAYLOAD_POLICY_H
diff --git a/utils/trie/payload-with-policy.hpp b/utils/trie/payload-with-policy.hpp
deleted file mode 100644
index c4c904e..0000000
--- a/utils/trie/payload-with-policy.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef PAYLOAD_WITH_INDEX_H_
-#define PAYLOAD_WITH_INDEX_H_
-
-/// @cond include_hidden
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-template<typename PayloadTraits, typename IndexTraits>
-class payload_with_index {
-public:
-  typedef PayloadTraits::pointer_type iterator;
-
-  typedef typename IndexTraits::
-    template index<PayloadTraits,
-                   typename IndexTraits::template container_hook<parent_trie>::type>::type
-      index_container;
-
-  inline payload_with_index()
-    : index_(*this)
-  {
-  }
-
-  inline std::pair<iterator, bool>
-  insert(typename iterator payload)
-  {
-    bool ok = policy_.insert(s_iterator_to(item.first));
-    if (!ok) {
-      item.first->erase(); // cannot insert
-      return std::make_pair(end(), false);
-    }
-
-    return item;
-  }
-
-  // inline void
-  // erase (const FullKey &key)
-  // {
-  //   iterator foundItem, lastItem;
-  //   bool reachLast;
-  //   std::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;
-  // }
-
-private:
-  mutable index_container policy_;
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // PAYLOAD_WITH_POLICY_H_
diff --git a/utils/trie/persistent-policy.hpp b/utils/trie/persistent-policy.hpp
deleted file mode 100644
index 669b8b2..0000000
--- a/utils/trie/persistent-policy.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef PERSISTENT_POLICY_H_
-#define PERSISTENT_POLICY_H_
-
-/// @cond include_hidden
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @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 (for NS-3 object model and 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_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // PERSISTENT_POLICY_H_
diff --git a/utils/trie/random-policy.hpp b/utils/trie/random-policy.hpp
deleted file mode 100644
index a6e3517..0000000
--- a/utils/trie/random-policy.hpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef RANDOM_POLICY_H_
-#define RANDOM_POLICY_H_
-
-/// @cond include_hidden
-
-#include "ns3/random-variable-stream.h"
-#include "ns3/double.h"
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/set.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for random replacement policy
- */
-struct random_policy_traits {
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and 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(CreateObject<UniformRandomVariable>())
-        , max_size_(100)
-      {
-        u_rand->SetAttribute("Min", DoubleValue(0));
-        u_rand->SetAttribute("Max", DoubleValue(std::numeric_limits<uint32_t>::max()));
-      }
-
-      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_;
-      Ptr<UniformRandomVariable> u_rand;
-      size_t max_size_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // RANDOM_POLICY_H
diff --git a/utils/trie/trie-with-policy.hpp b/utils/trie/trie-with-policy.hpp
deleted file mode 100644
index d0d54f6..0000000
--- a/utils/trie/trie-with-policy.hpp
+++ /dev/null
@@ -1,306 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef TRIE_WITH_POLICY_H_
-#define TRIE_WITH_POLICY_H_
-
-/// @cond include_hidden
-
-#include "trie.hpp"
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-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 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 = 1, size_t bucketIncrement = 1)
-    : trie_(name::Component(), 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;
-    std::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;
-    std::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;
-    std::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;
-    std::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;
-    std::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_if(const FullKey& key, Predicate pred)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    std::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();
-    }
-  }
-
-  /**
-   * @brief Find a node that has prefix at least as the key
-   *
-   * This version of find checks predicate for the next level and if
-   * predicate is True, returns first deepest match available
-   */
-  template<class Predicate>
-  inline iterator
-  deepest_prefix_match_if_next_level(const FullKey& key, Predicate pred)
-  {
-    iterator foundItem, lastItem;
-    bool reachLast;
-    std::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_next_level(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_;
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // TRIE_WITH_POLICY_H_
diff --git a/utils/trie/trie.hpp b/utils/trie/trie.hpp
deleted file mode 100644
index 6d11ecb..0000000
--- a/utils/trie/trie.hpp
+++ /dev/null
@@ -1,778 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef TRIE_H_
-#define TRIE_H_
-
-/// @cond include_hidden
-
-#include "ns3/ndnSIM/model/ndn-common.hpp"
-
-#include "ns3/ptr.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 <tuple>
-#include <boost/foreach.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/////////////////////////////////////////////////////
-// Allow customization for payload
-//
-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 = 0;
-
-template<typename Payload, typename BasePayload = Payload>
-struct smart_pointer_payload_traits {
-  typedef Payload payload_type;
-  typedef ns3::Ptr<Payload> storage_type;
-  typedef ns3::Ptr<Payload> insert_type;
-
-  typedef ns3::Ptr<Payload> return_type;
-  typedef ns3::Ptr<const Payload> const_return_type;
-
-  typedef ns3::Ptr<BasePayload> base_type;
-  typedef ns3::Ptr<const BasePayload> const_base_type;
-
-  static ns3::Ptr<Payload> empty_payload;
-};
-
-template<typename Payload, typename BasePayload>
-ns3::Ptr<Payload> smart_pointer_payload_traits<Payload, BasePayload>::empty_payload = 0;
-
-template<typename Payload, typename BasePayload = Payload>
-struct non_pointer_traits {
-  typedef Payload payload_type;
-  typedef Payload storage_type;
-  typedef const Payload& insert_type; // nothing to insert
-
-  typedef Payload& return_type;
-  typedef const Payload& const_return_type;
-
-  typedef BasePayload& base_type;
-  typedef const BasePayload& const_base_type;
-
-  static Payload empty_payload;
-};
-
-template<typename Payload, typename BasePayload>
-Payload non_pointer_traits<Payload, BasePayload>::empty_payload = Payload();
-
-////////////////////////////////////////////////////
-// 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::value_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 = 1, size_t bucketIncrement = 1)
-    : 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_(nullptr)
-  {
-  }
-
-  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 std::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 std::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 std::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 std::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 std::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;
-  }
-
-  /**
-   * @brief Find next payload of the sub-trie satisfying the predicate
-   * @param pred predicate
-   *
-   * This version check predicate only for the next level children
-   *
-   * @returns end() or a valid iterator pointing to the trie leaf (order is not defined, enumeration
-   *)
-   */
-  template<class Predicate>
-  inline const iterator
-  find_if_next_level(Predicate pred)
-  {
-    typedef trie<FullKey, PayloadTraits, PolicyHook> trie;
-    for (typename trie::unordered_set::iterator subnode = children_.begin();
-         subnode != children_.end(); subnode++) {
-      if (pred(subnode->key())) {
-        return subnode->find();
-      }
-    }
-
-    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_;
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-/// @endcond
-
-#endif // TRIE_H_