Checkpoint
diff --git a/utils/ndn-pit-queue.cc b/utils/ndn-pit-queue.cc
index 3486d6d..4d6c064 100644
--- a/utils/ndn-pit-queue.cc
+++ b/utils/ndn-pit-queue.cc
@@ -53,11 +53,19 @@
 PitQueue::Enqueue (Ptr<Face> inFace,
 		   Ptr<pit::Entry> pitEntry)
 {
-  Queue &queue = m_queues [inFace]; // either lookup or create
-  if (queue.size () >= m_maxQueueSize)
+  PerInFaceQueue::iterator queue = m_queues.find (inFace);
+  if (queue == m_queues.end ())
+    {
+      pair<PerInFaceQueue::iterator, bool> itemPair = m_queues.insert (make_pair (inFace, boost::make_shared<Queue> ()));
+      NS_ASSERT (itemPair.second == true);
+
+      queue = itemPair.first;
+    }
+  
+  if (queue->second->size () >= m_maxQueueSize)
       return false;
 
-  queue.push_back (pitEntry);
+  queue->second->push_back (pitEntry);
   return true;
 }
 
@@ -66,7 +74,7 @@
 {
   PerInFaceQueue::iterator queue = m_lastQueue;
 
-  while (queue != m_queues.end () && queue->second.size () == 0) // advance iterator
+  while (queue != m_queues.end () && queue->second->size () == 0) // advance iterator
     {
       queue ++;
     }
@@ -74,7 +82,7 @@
   if (queue == m_queues.end ())
     queue = m_queues.begin (); // circle to the beginning
 
-  while (queue != m_queues.end () && queue->second.size () == 0) // advance iterator
+  while (queue != m_queues.end () && queue->second->size () == 0) // advance iterator
     {
       queue ++;
     }
@@ -82,10 +90,10 @@
   if (queue == m_queues.end ()) // e.g., begin () == end ()
     return 0;
 
-  NS_ASSERT_MSG (queue->second.size () != 0, "Logic error");
+  NS_ASSERT_MSG (queue->second->size () != 0, "Logic error");
 
-  Ptr<pit::Entry> entry = *queue->second.begin ();
-  queue->second.pop_front ();
+  Ptr<pit::Entry> entry = *queue->second->begin ();
+  queue->second->pop_front ();
 
   m_lastQueue = queue;
   return entry;
diff --git a/utils/ndn-pit-queue.h b/utils/ndn-pit-queue.h
index de30713..34987db 100644
--- a/utils/ndn-pit-queue.h
+++ b/utils/ndn-pit-queue.h
@@ -25,6 +25,11 @@
 #include <list>
 
 #include "ns3/ptr.h"
+#include "ns3/ndn-fw-tag.h"
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
 
 namespace ns3 {
 namespace ndn {
@@ -57,18 +62,31 @@
   void
   Remove (Ptr<pit::Entry> entry);
 
-  
-private:
+public:  
   typedef std::list< Ptr<pit::Entry> > Queue;
-  typedef std::map< Ptr<Face>, Queue > PerInFaceQueue;
+  typedef std::map< Ptr<Face>, boost::shared_ptr<Queue> > PerInFaceQueue;
 
-  uint32_t m_maxQueueSize;
-
-  PerInFaceQueue::iterator m_lastQueue; // last queue from which interest was taken
+private:
   
+  uint32_t m_maxQueueSize;
+  PerInFaceQueue::iterator m_lastQueue; // last queue from which interest was taken
   PerInFaceQueue m_queues;
 };
 
+namespace fw {
+
+class PitQueueTag :
+    public Tag
+{
+public:
+  virtual
+  ~PitQueueTag () { };
+
+  typedef boost::tuple< boost::shared_ptr<PitQueue::Queue>, PitQueue::Queue::iterator > Item;
+};
+
+} // namespace fw
+
 } // namespace ndn
 } // namespace ns3