diff --git a/examples/trie.cc b/examples/trie.cc
index 7ec0c40..9c9cc3c 100644
--- a/examples/trie.cc
+++ b/examples/trie.cc
@@ -35,22 +35,22 @@
 
 NS_LOG_COMPONENT_DEFINE ("Trie");
 
-class Integer : public ns3::SimpleRefCount<Integer>
-{
-public:
-  Integer (int value) : value_ (value) {}
+// class Integer : public ns3::SimpleRefCount<Integer>
+// {
+// public:
+//   ::Integer (int value) : value_ (value) {}
 
-  operator int () const { return value_; }
-private:
-  int value_;
-};
+//   operator int () const { return value_; }
+// private:
+//   int value_;
+// };
 
-std::ostream &
-operator << (std::ostream &os, const Integer &i)
-{
-  os << (int)i;
-  return os;
-}
+// std::ostream &
+// operator << (std::ostream &os, const ::Integer &i)
+// {
+//   os << (int)i;
+//   return os;
+// }
 
 int
 main (int argc, char *argv[])
diff --git a/model/ccnx-bestroute-strategy.cc b/model/ccnx-bestroute-strategy.cc
index f455d60..6548ae5 100644
--- a/model/ccnx-bestroute-strategy.cc
+++ b/model/ccnx-bestroute-strategy.cc
@@ -73,7 +73,7 @@
 
   int propagatedCount = 0;
 
-  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->m_fibEntry->m_faces.get<i_metric> ())
+  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<i_metric> ())
     {
       if (metricFace.m_status == CcnxFibFaceMetric::NDN_FIB_RED) // all non-read faces are in front
         break;
@@ -81,16 +81,16 @@
       if (metricFace.m_face == incomingFace) 
         continue; // same face as incoming, don't forward
 
-      if (pitEntry->m_incoming.find (metricFace.m_face) != pitEntry->m_incoming.end ()) 
+      if (pitEntry->GetIncoming ().find (metricFace.m_face) != pitEntry->GetIncoming ().end ()) 
         continue; // don't forward to face that we received interest from
 
       CcnxPitEntryOutgoingFaceContainer::type::iterator outgoing =
-        pitEntry->m_outgoing.find (metricFace.m_face);
+        pitEntry->GetOutgoing ().find (metricFace.m_face);
       
-      if (outgoing != pitEntry->m_outgoing.end () &&
-          outgoing->m_retxCount >= pitEntry->m_maxRetxCount)
+      if (outgoing != pitEntry->GetOutgoing ().end () &&
+          outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
         {
-          NS_LOG_ERROR (outgoing->m_retxCount << " >= " << pitEntry->m_maxRetxCount);
+          NS_LOG_ERROR (outgoing->m_retxCount << " >= " << pitEntry->GetMaxRetxCount ());
           continue; // already forwarded before during this retransmission cycle
         }
 
diff --git a/model/ccnx-flooding-strategy.cc b/model/ccnx-flooding-strategy.cc
index 76c12a2..3531249 100644
--- a/model/ccnx-flooding-strategy.cc
+++ b/model/ccnx-flooding-strategy.cc
@@ -15,7 +15,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
 #include "ccnx-flooding-strategy.h"
@@ -83,7 +84,7 @@
 
   int propagatedCount = 0;
 
-  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->m_fibEntry->m_faces.get<i_metric> ())
+  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<i_metric> ())
     {
       NS_LOG_DEBUG ("Trying " << boost::cref(metricFace));
       if (metricFace.m_status == CcnxFibFaceMetric::NDN_FIB_RED) // all non-read faces are in the front of the list
@@ -96,15 +97,15 @@
         }
 
       CcnxPitEntryOutgoingFaceContainer::type::iterator outgoing =
-        pitEntry->m_outgoing.find (metricFace.m_face);
+        pitEntry->GetOutgoing ().find (metricFace.m_face);
       
-      if (outgoing != pitEntry->m_outgoing.end () &&
-          outgoing->m_retxCount >= pitEntry->m_maxRetxCount)
+      if (outgoing != pitEntry->GetOutgoing ().end () &&
+          outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
         {
           NS_LOG_DEBUG ("continue (same as previous outgoing)");
           continue; // already forwarded before during this retransmission cycle
         }
-      NS_LOG_DEBUG ("max retx count: " << pitEntry->m_maxRetxCount);
+      NS_LOG_DEBUG ("max retx count: " << pitEntry->GetMaxRetxCount ());
 
       bool faceAvailable = metricFace.m_face->IsBelowLimit ();
       if (!faceAvailable) // huh...
diff --git a/model/ccnx-forwarding-strategy.cc b/model/ccnx-forwarding-strategy.cc
index f518f95..df398c8 100644
--- a/model/ccnx-forwarding-strategy.cc
+++ b/model/ccnx-forwarding-strategy.cc
@@ -92,22 +92,22 @@
 
   int propagatedCount = 0;
   
-  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->m_fibEntry->m_faces.get<i_metric> ())
+  BOOST_FOREACH (const CcnxFibFaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<i_metric> ())
     {
       if (metricFace.m_status == CcnxFibFaceMetric::NDN_FIB_RED ||
           metricFace.m_status == CcnxFibFaceMetric::NDN_FIB_YELLOW)
         break; //propagate only to green faces
 
-      if (pitEntry->m_incoming.find (metricFace.m_face) != pitEntry->m_incoming.end ()) 
+      if (pitEntry->GetIncoming ().find (metricFace.m_face) != pitEntry->GetIncoming ().end ()) 
         continue; // don't forward to face that we received interest from
 
       CcnxPitEntryOutgoingFaceContainer::type::iterator outgoing =
-        pitEntry->m_outgoing.find (metricFace.m_face);
+        pitEntry->GetOutgoing ().find (metricFace.m_face);
       
-      if (outgoing != pitEntry->m_outgoing.end () &&
-          outgoing->m_retxCount >= pitEntry->m_maxRetxCount)
+      if (outgoing != pitEntry->GetOutgoing ().end () &&
+          outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
         {
-          NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry->m_maxRetxCount);
+          NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry->GetMaxRetxCount ());
           continue;
         }
       
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 27012e3..8cebc00 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -182,8 +182,8 @@
       
       // If this face is the only for the associated FIB entry, then FIB entry will be removed soon.
       // Thus, we have to remove the whole PIT entry
-      if (pitEntry->m_fibEntry->m_faces.size () == 1 &&
-          pitEntry->m_fibEntry->m_faces.begin ()->m_face == face)
+      if (pitEntry->GetFibEntry ()->m_faces.size () == 1 &&
+          pitEntry->GetFibEntry ()->m_faces.begin ()->m_face == face)
         {
           entriesToRemoves.push_back (pitEntry);
         }
@@ -301,14 +301,14 @@
       return;
     }
   
-  // CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry->m_incoming.find (incomingFace);
-  CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry->m_outgoing.find (incomingFace);
+  // CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry->GetIncoming ().find (incomingFace);
+  CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
 
-  if (outFace == pitEntry->m_outgoing.end ())
+  if (outFace == pitEntry->GetOutgoing ().end ())
     {
 //      NS_ASSERT_MSG (false,
 //                     "Node " << GetObject<Node> ()->GetId () << ", outgoing entry should exist for face " << boost::cref(*incomingFace) << "\n" <<
-//                     "size: " << pitEntry.m_outgoing.size ());
+//                     "size: " << pitEntry.GetOutgoing ().size ());
       
       // m_dropNacks (header, NON_DUPLICATE, incomingFace);
       return;
@@ -331,12 +331,12 @@
       pitEntry->RemoveIncoming (incomingFace);
     }
 
-  pitEntry->m_fibEntry->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW);
-  // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->m_fibEntry,
+  pitEntry->GetFibEntry ()->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW);
+  // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->GetFibEntry (),
   //                                           ll::bind (&CcnxFibEntry::UpdateStatus,
   //                                                     ll::_1, incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW));
 
-  if (pitEntry->m_incoming.size () == 0) // interest was actually satisfied
+  if (pitEntry->GetIncoming ().size () == 0) // interest was actually satisfied
     {
       // no need to do anything
       m_dropNacks (header, AFTER_SATISFIED, incomingFace);
@@ -392,7 +392,7 @@
       return;
     }
   
-  bool isNew = pitEntry->m_incoming.size () == 0 && pitEntry->m_outgoing.size () == 0;
+  bool isNew = pitEntry->GetIncoming ().size () == 0 && pitEntry->GetOutgoing ().size () == 0;
   bool isDuplicated = true;
   if (!pitEntry->IsNonceSeen (header->GetNonce ()))
     {
@@ -413,12 +413,12 @@
   /////////////////////////////////////////////////////////////////////////////////////////
   
   // Data is not in cache
-  CcnxPitEntry::in_iterator inFace   = pitEntry->m_incoming.find (incomingFace);
-  CcnxPitEntry::out_iterator outFace = pitEntry->m_outgoing.find (incomingFace);
+  CcnxPitEntry::in_iterator inFace   = pitEntry->GetIncoming ().find (incomingFace);
+  CcnxPitEntry::out_iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
 
   bool isRetransmitted = false;
   
-  if (inFace != pitEntry->m_incoming.end ())
+  if (inFace != pitEntry->GetIncoming ().end ())
     {
       // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
 
@@ -474,7 +474,7 @@
   // update PIT entry lifetime
   pitEntry->UpdateLifetime (header->GetInterestLifetime ());
   
-  if (outFace != pitEntry->m_outgoing.end ())
+  if (outFace != pitEntry->GetOutgoing ().end ())
     {
       NS_LOG_DEBUG ("Non duplicate interests from the face we have sent interest to. Don't suppress");
       // got a non-duplicate interest from the face we have sent interest to
@@ -485,8 +485,8 @@
 
       // ?? not sure if we need to do that ?? ...
       
-      pitEntry->m_fibEntry->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW);
-      // StaticCast<CcnxFibImpl> (m_fib)->modify(pitEntry->m_fibEntry,
+      pitEntry->GetFibEntry ()->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW);
+      // StaticCast<CcnxFibImpl> (m_fib)->modify(pitEntry->GetFibEntry (),
       //                                          ll::bind (&CcnxFibEntry::UpdateStatus,
       //                                                    ll::_1, incomingFace, CcnxFibFaceMetric::NDN_FIB_YELLOW));
     }
@@ -537,7 +537,7 @@
   if (pitEntry != 0)
     {
       //satisfy all pending incoming Interests
-      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->m_incoming)
+      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->GetIncoming ())
         {
           incoming.m_face->Send (packet->Copy ());
           m_outData (header, payload, false, incoming.m_face);
@@ -546,7 +546,7 @@
           // successfull forwarded data trace
         }
 
-      if (pitEntry->m_incoming.size () > 0)
+      if (pitEntry->GetIncoming ().size () > 0)
         {
           // All incoming interests are satisfied. Remove them
           pitEntry->ClearIncoming ();
@@ -582,13 +582,13 @@
     {
       // Note that with MultiIndex we need to modify entries indirectly
 
-      CcnxPitEntry::out_iterator out = pitEntry->m_outgoing.find (incomingFace);
+      CcnxPitEntry::out_iterator out = pitEntry->GetOutgoing ().find (incomingFace);
   
       // If we have sent interest for this data via this face, then update stats.
-      if (out != pitEntry->m_outgoing.end ())
+      if (out != pitEntry->GetOutgoing ().end ())
         {
-          pitEntry->m_fibEntry->UpdateFaceRtt (incomingFace, Simulator::Now () - out->m_sendTime);
-          // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->m_fibEntry,
+          pitEntry->GetFibEntry ()->UpdateFaceRtt (incomingFace, Simulator::Now () - out->m_sendTime);
+          // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->GetFibEntry (),
           //                                          ll::bind (&CcnxFibEntry::UpdateFaceRtt,
           //                                                    ll::_1,
           //                                                    incomingFace,
@@ -615,8 +615,8 @@
         }
 
       // Update metric status for the incoming interface in the corresponding FIB entry
-      pitEntry->m_fibEntry->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_GREEN);
-      // StaticCast<CcnxFibImpl>(m_fib)->modify (pitEntry->m_fibEntry,
+      pitEntry->GetFibEntry ()->UpdateStatus (incomingFace, CcnxFibFaceMetric::NDN_FIB_GREEN);
+      // StaticCast<CcnxFibImpl>(m_fib)->modify (pitEntry->GetFibEntry (),
       //                                          ll::bind (&CcnxFibEntry::UpdateStatus, ll::_1,
       //                                                    incomingFace, CcnxFibFaceMetric::NDN_FIB_GREEN));
   
@@ -625,7 +625,7 @@
 
       pitEntry->RemoveIncoming (incomingFace);
 
-      if (pitEntry->m_incoming.size () == 0)
+      if (pitEntry->GetIncoming ().size () == 0)
         {
           // Set pruning timout on PIT entry (instead of deleting the record)
           m_pit->MarkErased (pitEntry);
@@ -667,7 +667,7 @@
       header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
       packet->AddHeader (*header);
 
-      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->m_incoming)
+      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->GetIncoming ())
         {
           NS_LOG_DEBUG ("Send NACK for " << boost::cref (header->GetName ()) << " to " << boost::cref (*incoming.m_face));
           incoming.m_face->Send (packet->Copy ());
diff --git a/model/ccnx-pit-entry.cc b/model/ccnx-pit-entry.cc
index 491896e..3d3e5d7 100644
--- a/model/ccnx-pit-entry.cc
+++ b/model/ccnx-pit-entry.cc
@@ -36,9 +36,11 @@
 namespace ns3
 {
 
-CcnxPitEntry::CcnxPitEntry (Ptr<const CcnxInterestHeader> header,
+CcnxPitEntry::CcnxPitEntry (CcnxPit &container,
+                            Ptr<const CcnxInterestHeader> header,
                             Ptr<CcnxFibEntry> fibEntry)
-  : m_prefix (header->GetNamePtr ())
+  : m_container (container)
+  , m_prefix (header->GetNamePtr ())
   , m_expireTime (Simulator::Now () + header->GetInterestLifetime ())
   , m_fibEntry (fibEntry)
   , m_maxRetxCount (0)
diff --git a/model/ccnx-pit-entry.h b/model/ccnx-pit-entry.h
index 2e38657..5d85c94 100644
--- a/model/ccnx-pit-entry.h
+++ b/model/ccnx-pit-entry.h
@@ -41,6 +41,7 @@
 
 class CcnxFace;
 class CcnxNameComponents;
+class CcnxPit;
 
 /// @cond include_hidden
 namespace __ccnx_private
@@ -80,6 +81,8 @@
 /**
  * \ingroup ccnx
  * \brief structure for PIT entry
+ *
+ * All set-methods are virtual, in case index rearrangement is necessary in the derived classes
  */
 struct CcnxPitEntry : SimpleRefCount<CcnxPitEntry>
 {
@@ -98,7 +101,12 @@
    * \param offsetTime Relative time to the current moment, representing PIT entry lifetime
    * \param fibEntry A FIB entry associated with the PIT entry
    */
-  CcnxPitEntry (Ptr<const CcnxInterestHeader> header, Ptr<CcnxFibEntry> fibEntry);
+  CcnxPitEntry (CcnxPit &container, Ptr<const CcnxInterestHeader> header, Ptr<CcnxFibEntry> fibEntry);
+
+  /**
+   * @brief Virtual destructor
+   */
+  virtual ~CcnxPitEntry () {}
   
   /**
    * @brief Update lifetime of PIT entry
@@ -108,7 +116,7 @@
    *
    * @param offsetTime Relative time to the current moment, representing PIT entry lifetime
    */
-  void
+  virtual void
   UpdateLifetime (const Time &offsetTime);
 
   /**
@@ -132,7 +140,7 @@
    *
    * @param expireTime absolute simulation time of when the record should expire
    */
-  void
+  virtual void
   SetExpireTime (const Time &expireTime);
   
   /**
@@ -151,7 +159,7 @@
    *
    * All nonces are stored for the lifetime of the PIT entry
    */
-  void
+  virtual void
   AddSeenNonce (uint32_t nonce)
   { m_seenNonces.insert (nonce); }
 
@@ -161,19 +169,19 @@
    * @param face Face to add to the list of incoming faces
    * @returns iterator to the added entry
    */
-  in_iterator
+  virtual in_iterator
   AddIncoming (Ptr<CcnxFace> face);
 
   /**
    * @brief Remove incoming entry for face `face`
    */
-  void
+  virtual void
   RemoveIncoming (Ptr<CcnxFace> face);
 
   /**
    * @brief Clear all incoming faces either after all of them were satisfied or NACKed
    */
-  void
+  virtual void
   ClearIncoming ()
   { m_incoming.clear (); }
 
@@ -183,13 +191,13 @@
    * @param face Face to add to the list of outgoing faces
    * @returns iterator to the added entry
    */
-  out_iterator
+  virtual out_iterator
   AddOutgoing (Ptr<CcnxFace> face);
 
   /**
    * @brief Clear all incoming faces either after all of them were satisfied or NACKed
    */
-  void
+  virtual void
   ClearOutgoing ()
   { m_outgoing.clear (); }  
   
@@ -199,13 +207,13 @@
    * This method should be called before face is completely removed from the stack.
    * Face is removed from the lists of incoming and outgoing faces
    */
-  void
+  virtual void
   RemoveAllReferencesToFace (Ptr<CcnxFace> face);
 
   /**
    * @brief Flag outgoing face as hopeless
    */
-  void
+  virtual void
   SetWaitingInVain (out_iterator face);
   
   /**
@@ -224,17 +232,27 @@
   /**
    * @brief Increase maximum limit of allowed retransmission per outgoing face
    */
-  void
+  virtual void
   IncreaseAllowedRetxCount ();
-  
+
+  Ptr<CcnxFibEntry>
+  GetFibEntry () { return m_fibEntry; };
+
+  const in_container &
+  GetIncoming () const { return m_incoming; }
+
+  const out_container &
+  GetOutgoing () const { return m_outgoing; }
+
+  uint32_t
+  GetMaxRetxCount () const { return m_maxRetxCount; }
+
 private:
   friend std::ostream& operator<< (std::ostream& os, const CcnxPitEntry &entry);
-  /**
-   * \brief Default constructor
-   */
-  CcnxPitEntry () {};
   
-public:
+protected:
+  CcnxPit &m_container; ///< @brief Reference to the container (to rearrange indexes, if necessary)
+  
   Ptr<const CcnxNameComponents> m_prefix; ///< \brief Prefix of the PIT entry
   Ptr<CcnxFibEntry> m_fibEntry;     ///< \brief FIB entry related to this prefix
   
diff --git a/model/ccnx-pit-impl.cc b/model/ccnx-pit-impl.cc
index 5e353a9..e5179d3 100644
--- a/model/ccnx-pit-impl.cc
+++ b/model/ccnx-pit-impl.cc
@@ -39,6 +39,21 @@
 
 NS_OBJECT_ENSURE_REGISTERED (CcnxPitImpl);
 
+
+// CcnxPitEntryImpl::CcnxPitEntryImpl (CcnxPit &pit,
+//                                     Ptr<const CcnxInterestHeader> header,
+//                                     Ptr<CcnxFibEntry> fibEntry)
+//   : CcnxPitEntry (pit, header, fibEntry)
+//   , item_ (0)
+// {
+//   static_cast<CcnxPitImpl&> (m_container).i_time.insert (*this);
+// }
+
+// CcnxPitEntryImpl::~CcnxPitEntryImpl ()
+// {
+//   static_cast<CcnxPitImpl&> (m_container).i_time.erase (*this);
+// }
+
 TypeId
 CcnxPitImpl::GetTypeId ()
 {
@@ -149,7 +164,7 @@
                  " Prefix = "<< header->GetName() << "NodeID == " << m_fib->GetObject<Node>()->GetId() << "\n" << *m_fib);
 
 
-  Ptr<CcnxPitEntryImpl> newEntry = ns3::Create<CcnxPitEntryImpl> (header, fibEntry);
+  Ptr< entry > newEntry = ns3::Create< entry > (boost::ref (*this), header, fibEntry);
   std::pair< super::iterator, bool > result = super::insert (header->GetName (), newEntry);
   if (result.first != super::end ())
     {
@@ -171,10 +186,10 @@
 
 
 void
-CcnxPitImpl::MarkErased (Ptr<CcnxPitEntry> entry)
+CcnxPitImpl::MarkErased (Ptr<CcnxPitEntry> item)
 {
   // entry->SetExpireTime (Simulator::Now () + m_PitEntryPruningTimout);
-  super::erase (StaticCast<CcnxPitEntryImpl> (entry)->to_iterator ());
+  super::erase (StaticCast< entry > (item)->to_iterator ());
 }
 
 
@@ -219,7 +234,7 @@
   if (from == 0) return 0;
   
   super::parent_trie::recursive_iterator
-    item (*StaticCast<CcnxPitEntryImpl> (from)->to_iterator ()),
+    item (*StaticCast< entry > (from)->to_iterator ()),
     end (0);
   
   for (item++; item != end; item++)
diff --git a/model/ccnx-pit-impl.h b/model/ccnx-pit-impl.h
index 499957f..9dfd62b 100644
--- a/model/ccnx-pit-impl.h
+++ b/model/ccnx-pit-impl.h
@@ -29,33 +29,46 @@
 
 namespace ns3 {
 
+template<class Pit>
 class CcnxPitEntryImpl : public CcnxPitEntry
 {
 public:
-  typedef ndnSIM::trie_with_policy<
-    CcnxNameComponents,
-    ndnSIM::smart_pointer_payload_traits<CcnxPitEntryImpl>,
-    ndnSIM::persistent_policy_traits
-    > trie;
-
-  CcnxPitEntryImpl (Ptr<const CcnxInterestHeader> header,
+  CcnxPitEntryImpl (CcnxPit &pit,
+                    Ptr<const CcnxInterestHeader> header,
                     Ptr<CcnxFibEntry> fibEntry)
-    : CcnxPitEntry (header, fibEntry)
-    , item_ (0)
+  : CcnxPitEntry (pit, header, fibEntry)
+  , item_ (0)
   {
+    static_cast<Pit&> (m_container).i_time.insert (*this);    
+  }
+  
+  virtual ~CcnxPitEntryImpl ()
+  {
+    static_cast<Pit&> (m_container).i_time.erase (*this);
   }
 
+  // to make sure policies work
   void
-  SetTrie (trie::iterator item)
-  {
-    item_ = item;
-  }
+  SetTrie (typename Pit::super::iterator item) { item_ = item; }
 
-  trie::iterator to_iterator () { return item_; }
-  trie::const_iterator to_iterator () const { return item_; }
+  typename Pit::super::iterator to_iterator () { return item_; }
+  typename Pit::super::const_iterator to_iterator () const { return item_; }
+
+public:
+  boost::intrusive::set_member_hook<> time_hook_;
   
 private:
-  trie::iterator item_;
+  typename Pit::super::iterator item_;
+};
+
+template<class T>
+struct TimestampIndex
+{
+  bool
+  operator () (const T &a, const T &b) const
+  {
+    return a.GetExpireTime () < b.GetExpireTime ();
+  }
 };
 
 ////////////////////////////////////////////////////////////////////////
@@ -66,10 +79,19 @@
  * \brief Class implementing Pending Interests Table
  */
 class CcnxPitImpl : public CcnxPit
-                  , protected CcnxPitEntryImpl::trie
+                  , protected ndnSIM::trie_with_policy<CcnxNameComponents,
+                                                       ndnSIM::smart_pointer_payload_traits<CcnxPitEntryImpl< CcnxPitImpl > >,
+                                                       ndnSIM::persistent_policy_traits
+                                                       >
 {
 public:
-  typedef CcnxPitEntryImpl::trie super;
+  typedef ndnSIM::trie_with_policy<CcnxNameComponents,
+                                   ndnSIM::smart_pointer_payload_traits<CcnxPitEntryImpl< CcnxPitImpl > >,
+                                   ndnSIM::persistent_policy_traits
+                                   > super;
+  typedef CcnxPitEntryImpl< CcnxPitImpl > entry;
+
+  // typedef CcnxPitEntryImpl::trie super;
 
   /**
    * \brief Interface ID
@@ -130,6 +152,18 @@
   
 private:
   Ptr<CcnxFib> m_fib; ///< \brief Link to FIB table
+
+  // indexes
+  typedef
+  boost::intrusive::set<entry,
+                        boost::intrusive::compare < TimestampIndex< entry > >,
+                        boost::intrusive::member_hook< entry,
+                                                       boost::intrusive::set_member_hook<>,
+                                                       &entry::time_hook_>
+                        > expireTimeIndexType;
+  expireTimeIndexType i_time; 
+                        
+  friend class CcnxPitEntryImpl< CcnxPitImpl >;
 };
 
 } // namespace ns3
diff --git a/utils/payload-with-policy.h b/utils/payload-with-policy.h
new file mode 100644
index 0000000..9fd6709
--- /dev/null
+++ b/utils/payload-with-policy.h
@@ -0,0 +1,104 @@
+/* -*-  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 PAYLOAD_WITH_INDEX_H_
+#define PAYLOAD_WITH_INDEX_H_
+
+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;
+  //   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;
+  // }
+
+private:
+  mutable index_container policy_;
+};
+
+} // ndnSIM
+
+#endif // PAYLOAD_WITH_POLICY_H_
