diff --git a/utils/ndn-pit-queue.cc b/utils/ndn-pit-queue.cc
deleted file mode 100644
index d3d54b3..0000000
--- a/utils/ndn-pit-queue.cc
+++ /dev/null
@@ -1,353 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-pit-queue.h"
-
-#include "ns3/ndn-face.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-
-#include "ns3/assert.h"
-
-using namespace std;
-using namespace boost;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.PitQueue");
-
-namespace ns3 {
-namespace ndn {
-
-const double MIN_WEIGHT = 0.01;
-
-PitQueue::PitQueue ()
-  // : m_maxQueueSize (20)
-  : m_lastQueue (m_queues.end ())
-{
-}
-  
-// void
-// PitQueue::SetMaxQueueSize (uint32_t size)
-// {
-//   m_maxQueueSize = size;
-// }
-
-// uint32_t
-// PitQueue::GetMaxQueueSize () const
-// {
-//   return m_maxQueueSize;
-// }
-
-
-bool
-PitQueue::Enqueue (Ptr<Face> inFace,
-		   Ptr<pit::Entry> pitEntry,
-                   double updatedWeight)
-{
-  if (updatedWeight < 0) updatedWeight = 0.5;
-  if (updatedWeight < MIN_WEIGHT) updatedWeight = MIN_WEIGHT;
-  
-  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< WeightedQueue > (make_tuple (Queue (), updatedWeight, 0))));
-      m_lastQueue = m_queues.end (); // for some reason end() iterator is invalidated when new item is inserted
-      NS_ASSERT (itemPair.second == true);
-
-      queue = itemPair.first;
-    }
-  else
-    {
-      queue->second->get<1> () = updatedWeight;
-    }
-
-  if ((inFace->GetLimits ().GetMaxLimit () == 0 && queue->second->get<0> ().size () > 100) ||
-      (inFace->GetLimits ().GetMaxLimit () != 0 && queue->second->get<0> ().size () >= 0.5 * inFace->GetLimits ().GetMaxLimit ()))
-    {
-      return false;
-    }
-
-  Queue::iterator itemIterator = queue->second->get<0> ().insert (queue->second->get<0> ().end (), pitEntry);
-  
-  shared_ptr<fw::PitQueueTag> tag = pitEntry->GetFwTag<fw::PitQueueTag> ();
-  if (tag == shared_ptr<fw::PitQueueTag> ())
-    {
-      tag = make_shared<fw::PitQueueTag> ();
-      pitEntry->AddFwTag (tag);
-    }
-  tag->InsertQueue (queue->second, itemIterator);
-
-  // if (Simulator::GetContext () == 4)
-  //   {
-  //     cout << "====== " << Simulator::Now ().ToDouble (Time::S) << "s " << *queue->first << endl;
-  //     cout << "       " << m_serviceCounter << " / " << queue->second->get<1> () << " / " << queue->second->get<2> () << "\n";
-  //     for (PerInFaceQueue::const_iterator somequeue = m_queues.begin ();
-  //          somequeue != m_queues.end ();
-  //          somequeue ++)
-  //       {
-  //         if (somequeue == queue) cout << "*";
-  //         cout << somequeue->second->get<0> ().size () << " ";
-  //       }
-  //     cout << endl;
-  //   }
-
-  UpdateWeightedRounds ();
-  
-  return true;
-}
-
-
-Ptr<pit::Entry>
-PitQueue::Pop ()
-{
-  PerInFaceQueue::iterator queue = m_lastQueue;
-
-  if (queue != m_queues.end () &&
-      m_serviceCounter >= queue->second->get<2> ())
-    {
-      queue ++; // actually implement weighted round robin...
-      m_serviceCounter = 0;
-    } 
-
-  while (queue != m_queues.end () && queue->second->get<0> ().size () == 0) // advance iterator
-    {
-      queue ++;
-      m_serviceCounter = 0;
-    }
-
-  if (queue == m_queues.end ())
-    {
-      queue = m_queues.begin (); // circle to the beginning
-      m_serviceCounter = 0;
-    }
-
-  while (queue != m_queues.end () && queue->second->get<0> ().size () == 0) // advance iterator
-    {
-      queue ++;
-      m_serviceCounter = 0;
-    }
-  
-  m_serviceCounter ++;
-  
-  // if (Simulator::GetContext () == 4)
-  //   {
-  //     cout << "====== " << Simulator::Now ().ToDouble (Time::S) << "s " << *queue->first << endl;
-  //     cout << "       " << m_serviceCounter << " / " << queue->second->get<1> () << " / " << queue->second->get<2> () << "\n";
-  //     for (PerInFaceQueue::const_iterator somequeue = m_queues.begin ();
-  //          somequeue != m_queues.end ();
-  //          somequeue ++)
-  //       {
-  //         if (somequeue == queue) cout << "*";
-  //         cout << somequeue->second->get<0> ().size () << " ";
-  //       }
-  //     cout << endl;
-  //   }
-
-  if (queue == m_queues.end () || queue->second->get<0> ().size () == 0) 
-    return 0;
-  
-  NS_ASSERT_MSG (queue->second->get<0> ().size () != 0, "Logic error");
-
-  Ptr<pit::Entry> entry = *queue->second->get<0> ().begin ();
-  shared_ptr<fw::PitQueueTag> tag = entry->GetFwTag<fw::PitQueueTag> ();
-  NS_ASSERT (tag != shared_ptr<fw::PitQueueTag> ());
-
-#ifdef NS3_LOG_ENABLE
-  size_t queueSize = queue->second->get<0> ().size ();
-#endif
-  tag->RemoveFromQueue (queue->second);
-#ifdef NS3_LOG_ENABLE
-  NS_ASSERT_MSG (queue->second->get<0> ().size () == queueSize-1, "Queue size should be reduced by one");
-#endif
-
-  m_lastQueue = queue;
-  return entry;
-}
-
-void
-PitQueue::Remove (Ptr<Face> face)
-{
-  if (m_lastQueue->first == face)
-    {
-      m_lastQueue++;
-    }
-
-  PerInFaceQueue::iterator queue = m_queues.find (face);
-  if (queue == m_queues.end ())
-    return;
-
-  for (Queue::iterator pitEntry = queue->second->get<0> ().begin ();
-       pitEntry != queue->second->get<0> ().end ();
-       pitEntry ++)
-    {
-      shared_ptr<fw::PitQueueTag> tag = (*pitEntry)->GetFwTag<fw::PitQueueTag> ();
-      NS_ASSERT (tag != shared_ptr<fw::PitQueueTag> ());
-
-      tag->RemoveFromQueuesExcept (queue->second);
-    }
-
-  NS_ASSERT_MSG (queue->second->get<0> ().size () == 0, "Queue size should be 0 by now");
-  m_queues.erase (queue);
-}
-
-void
-PitQueue::Remove (Ptr<pit::Entry> entry)
-{
-  shared_ptr<fw::PitQueueTag> tag = entry->GetFwTag<fw::PitQueueTag> ();
-  if (tag == shared_ptr<fw::PitQueueTag> ())
-    return;
-
-  tag->RemoveFromAllQueues ();
-}
-
-bool
-PitQueue::IsEmpty () const
-{
-  bool isEmpty = true;
-
-  for (PerInFaceQueue::const_iterator queue = m_queues.begin ();
-       queue != m_queues.end ();
-       queue ++)
-    {
-      isEmpty &= (queue->second->get<0> ().size () == 0);
-    }
-
-  return isEmpty;
-}
-
-bool
-PitQueue::IsEmpty (Ptr<Face> inFace) const
-{
-  PerInFaceQueue::const_iterator queue = m_queues.find (inFace);
-  if (queue == m_queues.end ())
-    return true;
-
-  return queue->second->get<0> ().size () == 0;
-}
-
-
-void
-PitQueue::UpdateWeightedRounds ()
-{
-  double minWeight = 100.0;
-  for (PerInFaceQueue::const_iterator queue = m_queues.begin ();
-       queue != m_queues.end ();
-       queue ++)
-    {
-      if (queue->second->get<1> () < minWeight)
-        minWeight = queue->second->get<1> ();
-    }
-
-  for (PerInFaceQueue::const_iterator queue = m_queues.begin ();
-       queue != m_queues.end ();
-       queue ++)
-    {
-      queue->second->get<2> () = static_cast<uint32_t>((queue->second->get<1> () / minWeight) + 0.5);
-      if (queue->second->get<2> () < 1)
-        queue->second->get<2> () = 1;
-    }
-
-  // if (m_queues.size () > 1)
-  //   {
-  //     cout << "Node " << Simulator::GetContext () << " (min = " << minWeight << "): ";
-  //     for (PerInFaceQueue::const_iterator queue = m_queues.begin ();
-  //          queue != m_queues.end ();
-  //          queue ++)
-  //       {
-  //         cout << queue->second->get<1> () << "/" << queue->second->get<2> () << "  ";
-  //       }
-  //     cout << endl;
-  //   }
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-
-void
-fw::PitQueueTag::InsertQueue (boost::shared_ptr<PitQueue::WeightedQueue> queue, PitQueue::Queue::iterator iterator)
-{
-  // std::cerr << "size before: " << m_items.size () << " item: " << (*iterator)->GetPrefix ();
-  pair<MapOfItems::iterator, bool> item = m_items.insert (make_pair (queue, iterator));
-  // std::cerr << " and after: " << m_items.size () << std::endl; 
-  NS_ASSERT_MSG (item.second == true, "Should be a new tag for PIT entry, but something is wrong");
-}
-
-void
-fw::PitQueueTag::RemoveFromAllQueues ()
-{
-  for (MapOfItems::iterator item = m_items.begin ();
-       item != m_items.end ();
-       item ++)
-    {
-      item->first->get<0> ().erase (item->second);
-    }
-  m_items.clear ();
-}
-
-void
-fw::PitQueueTag::RemoveFromQueue (boost::shared_ptr<PitQueue::WeightedQueue> queue)
-{
-  MapOfItems::iterator item = m_items.find (queue);
-  if (item == m_items.end ())
-    return;
-
-  item->first->get<0> ().erase (item->second);
-  m_items.erase (item);
-}
-
-void
-fw::PitQueueTag::RemoveFromQueuesExcept (boost::shared_ptr<PitQueue::WeightedQueue> queue)
-{
-  for (MapOfItems::iterator item = m_items.begin ();
-       item != m_items.end (); )
-    {
-      if (item->first == queue)
-        {
-          item ++;
-          continue;
-        }
-
-      item->first->get<0> ().erase (item->second);
-
-      MapOfItems::iterator itemToDelete = item;
-      item ++;
-      m_items.erase (itemToDelete);
-    }
-}
-
-bool
-fw::PitQueueTag::IsLastOneInQueues () const
-{
-  bool lastOne = true;
-  
-  for (MapOfItems::const_iterator item = m_items.begin ();
-       item != m_items.end ();
-       item ++)
-    {
-      lastOne &= (item->first->get<0> ().size () == 1);
-    }
-
-  return lastOne;
-}
-
-
-} // namespace ndn
-} // namespace ns3
diff --git a/utils/ndn-pit-queue.h b/utils/ndn-pit-queue.h
deleted file mode 100644
index d7e20ec..0000000
--- a/utils/ndn-pit-queue.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_PIT_QUEUE_H
-#define NDN_PIT_QUEUE_H
-
-#include <map>
-#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 {
-
-class Face;
-namespace pit { class Entry; }
-
-/**
- * @ingroup ndn
- * @brief Queue for PIT entries, interests for which cannot be immediately forwarded
- */
-class PitQueue
-{
-public:
-  /**
-   * @brief Default constructor
-   */
-  PitQueue ();
-
-  /**
-   * @brief Set maximum queue size
-   * @param size per-incoming face maximum queue size
-   *
-   * Each per-incoming-face queue will have this maximum size
-   */
-  void
-  SetMaxQueueSize (uint32_t size);
-
-  /**
-   * @brief Get current maximum queue size
-   * @returns per-incoming face maximum queue size
-   */
-  uint32_t
-  GetMaxQueueSize () const;
-
-  /**
-   * @brief Enqueue PIT entry for delayed processing
-   * @param inFace incoming face to which queue PIT entry should enqueued
-   * @param pitEntry smart pointer to PIT entry
-   * @param updatedWeight the current value for the inFace weight (stats-based weight)
-   * return true if successfully enqueued, false if limit is reached or some other reason
-   */
-  bool
-  Enqueue (Ptr<Face> inFace,
-           Ptr<pit::Entry> pitEntry,
-           double updatedWeight);
-
-  /**
-   * @brief Get next PIT entry
-   * @returns next PIT entry or 0 if no entries available
-   *
-   * This method implement round-robin (in future weighted round-robin) to pick elements from different per-in-face queues
-   */
-  Ptr<pit::Entry>
-  Pop ();
-
-  /**
-   * @brief Remove all references to face from all queues and enqueued PIT entries
-   * @param face smart pointer to face
-   */
-  void
-  Remove (Ptr<Face> face);
-
-  /**
-   * @brief Remove all references to PIT entry from queues
-   * @param entry smart pointer to PIT entry
-   */
-  static void
-  Remove (Ptr<pit::Entry> entry);
-
-  /**
-   * @brief Check if all per-in-face queues is empty
-   */
-  bool
-  IsEmpty () const;
-
-  /**
-   * @brief Check if the specified per-in-face queue is empty
-   */
-  bool
-  IsEmpty (Ptr<Face> inFace) const;
-
-private:
-  void
-  UpdateWeightedRounds ();
-  
-public:  
-  typedef std::list< Ptr<pit::Entry> > Queue;
-  typedef boost::tuple< Queue, double, uint32_t > WeightedQueue;
-  typedef std::map< Ptr<Face>, boost::shared_ptr<WeightedQueue> > PerInFaceQueue;
-
-private:
-  // uint32_t m_maxQueueSize;
-  PerInFaceQueue::iterator m_lastQueue; // last queue from which interest was taken
-  PerInFaceQueue m_queues;
-
-  uint32_t m_serviceCounter;
-  
-};
-
-namespace fw {
-
-/**
- * @ingroup ndn
- * @brief Forwarding strategy tag that stores queue-related information in PIT entries
- */
-class PitQueueTag :
-    public Tag
-{
-public:
-  // map based on addresses, should be good enough
-  typedef std::map< boost::shared_ptr<PitQueue::WeightedQueue>, PitQueue::Queue::iterator > MapOfItems;
-
-public:
-  /**
-   * @brief Virtual destructor
-   */
-  virtual
-  ~PitQueueTag () { };  
-
-  /**
-   * @brief Remember in which queue at which position PIT entry is enqueued
-   * @brief item     smart pointer to Queue
-   * @brief iterator queue's iterator
-   */
-  void
-  InsertQueue (boost::shared_ptr<PitQueue::WeightedQueue> item, PitQueue::Queue::iterator iterator);
-
-  /**
-   * @brief Remove PIT entry from all queues
-   */
-  void
-  RemoveFromAllQueues ();
-
-  /**
-   * @brief Remove PIT entry from the specified queue
-   * @param queue Queue from which PIT entry should be removed
-   */
-  void
-  RemoveFromQueue (boost::shared_ptr<PitQueue::WeightedQueue> queue);
-
-  /**
-   * @brief Remove reference to PIT from queues except the queue in parameter
-   * @param queue Queue from which PIT entry should not be removed (to preserve iterator)
-   */
-  void
-  RemoveFromQueuesExcept (boost::shared_ptr<PitQueue::WeightedQueue> queue);
-
-  /**
-   * @brief Check if removal of the entry will empty all the queues
-   */
-  bool
-  IsLastOneInQueues () const;
-  
-private:
-  MapOfItems m_items;
-};
-
-} // namespace fw
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDN_PIT_QUEUE_H
