diff --git a/apps/ccnx-producer.cc b/apps/ccnx-producer.cc
index 6d36eb3..8b57513 100644
--- a/apps/ccnx-producer.cc
+++ b/apps/ccnx-producer.cc
@@ -30,7 +30,7 @@
 
 #include "ns3/ccnx-app-face.h"
 #include "ns3/ccnx-fib.h"
-#include "../model/ccnx-fib-impl.h"
+// #include "../model/ccnx-fib-impl.h"
 
 #include <boost/ref.hpp>
 #include <boost/lambda/lambda.hpp>
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index 8fbbcce..9ee9aac 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -39,7 +39,9 @@
 
 #include "ns3/ccnx-forwarding-strategy.h"
 #include "ns3/ccnx-fib.h"
+#include "ns3/ccnx-pit.h"
 #include "ns3/ccnx-name-components.h"
+#include "ns3/ccnx-content-store.h"
 
 #include "ns3/node-list.h"
 // #include "ns3/loopback-net-device.h"
diff --git a/model/ccnx-forwarding-strategy.cc b/model/ccnx-forwarding-strategy.cc
deleted file mode 100644
index df398c8..0000000
--- a/model/ccnx-forwarding-strategy.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *          Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ns3/assert.h"
-
-#include "ccnx-forwarding-strategy.h"
-#include "ns3/ptr.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-
-#include "ccnx-pit.h"
-#include "ccnx-pit-entry.h"
-
-#include "ccnx-interest-header.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("CcnxForwardingStrategy");
-
-namespace ns3 {
-
-using namespace __ccnx_private;
-
-NS_OBJECT_ENSURE_REGISTERED (CcnxForwardingStrategy);
-
-TypeId CcnxForwardingStrategy::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::CcnxForwardingStrategy")
-    .SetGroupName ("Ccnx")
-    .SetParent<Object> ()
-
-    .AddTraceSource ("OutInterests", "Interests that were transmitted",
-                    MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_transmittedInterestsTrace))
-
-    ;
-  return tid;
-}
-
-CcnxForwardingStrategy::CcnxForwardingStrategy ()
-{
-}
-
-CcnxForwardingStrategy::~CcnxForwardingStrategy ()
-{
-}
-
-void
-CcnxForwardingStrategy::NotifyNewAggregate ()
-{
-  if (m_pit == 0)
-    {
-      m_pit = GetObject<CcnxPit> ();
-    }
-}
-
-void
-CcnxForwardingStrategy::DoDispose ()
-{
-  // nothing to do...
-}
-
-bool
-CcnxForwardingStrategy::PropagateInterestViaGreen (Ptr<CcnxPitEntry> pitEntry, 
-                                                   const Ptr<CcnxFace> &incomingFace,
-                                                   Ptr<CcnxInterestHeader> &header,
-                                                   const Ptr<const Packet> &packet)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT_MSG (m_pit != 0, "PIT should be aggregated with forwarding strategy");
-
-  int propagatedCount = 0;
-  
-  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->GetIncoming ().find (metricFace.m_face) != pitEntry->GetIncoming ().end ()) 
-        continue; // don't forward to face that we received interest from
-
-      CcnxPitEntryOutgoingFaceContainer::type::iterator outgoing =
-        pitEntry->GetOutgoing ().find (metricFace.m_face);
-      
-      if (outgoing != pitEntry->GetOutgoing ().end () &&
-          outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
-        {
-          NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry->GetMaxRetxCount ());
-          continue;
-        }
-      
-      bool faceAvailable = metricFace.m_face->IsBelowLimit ();
-      if (!faceAvailable) // huh...
-        {
-          // let's try different green face
-          continue;
-        }
-
-      pitEntry->AddOutgoing (metricFace.m_face);
-
-      Ptr<Packet> packetToSend = packet->Copy ();
-
-      //transmission
-      metricFace.m_face->Send (packetToSend);
-      m_transmittedInterestsTrace (header, metricFace.m_face);
-      
-      propagatedCount++;
-      break; // propagate only one interest
-    }
-
-  return propagatedCount > 0;
-}
-
-} //namespace ns3
diff --git a/model/ccnx-forwarding-strategy.h b/model/ccnx-forwarding-strategy.h
deleted file mode 100644
index ed28fd4..0000000
--- a/model/ccnx-forwarding-strategy.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *          Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-#ifndef CCNX_FORWARDING_STRATEGY_H
-#define CCNX_FORWARDING_STRATEGY_H
-
-#include "ns3/packet.h"
-#include "ns3/callback.h"
-#include "ns3/object.h"
-#include "ns3/traced-callback.h"
-
-namespace ns3 {
-
-class CcnxFace;
-class CcnxInterestHeader;
-class CcnxPit;
-class CcnxPitEntry;
-class CcnxFibFaceMetric;
-
-/**
- * \ingroup ccnx
- * \brief Abstract base class for CCNx forwarding strategies
- */
-class CcnxForwardingStrategy : public Object
-{
-public:
-  static TypeId GetTypeId (void);
-
-  /**
-   * @brief Default constructor
-   */
-  CcnxForwardingStrategy ();
-  virtual ~CcnxForwardingStrategy ();
-
-  /**
-   * @brief Base method to propagate the interest according to the forwarding strategy
-   *
-   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
-   * @param incomingFace  Incoming face
-   * @param header        CcnxInterestHeader
-   * @param packet        Original Interest packet
-   * @param sendCallback  Send callback
-   *
-   * @return true if interest was successfully propagated, false if all options have failed
-   */
-  virtual bool
-  PropagateInterest (Ptr<CcnxPitEntry> pitEntry, 
-                     const Ptr<CcnxFace> &incomingFace,
-                     Ptr<CcnxInterestHeader> &header,
-                     const Ptr<const Packet> &packet) = 0;
-    
-protected:
-  /**
-   * @brief Propagate interest via a green interface. Fail, if no green interfaces available
-   *
-   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
-   * @param incomingFace  Incoming face
-   * @param header        CcnxInterestHeader
-   * @param packet        Original Interest packet
-   * @param sendCallback  Send callback
-   * @return true if interest was successfully propagated, false if all options have failed
-   *
-   * \see PropagateInterest
-   */
-  bool
-  PropagateInterestViaGreen (Ptr<CcnxPitEntry> pitEntry, 
-                             const Ptr<CcnxFace> &incomingFace,
-                             Ptr<CcnxInterestHeader> &header,
-                             const Ptr<const Packet> &packet);
-
-  /// @brief Transmitted interests trace
-  TracedCallback<Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
-
-protected:
-  // inherited from Object class                                                                                                                                                        
-  virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
-  virtual void DoDispose (); ///< @brief Do cleanup
-  
-protected:  
-  Ptr<CcnxPit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
-};
-
-} //namespace ns3
-
-#endif /* CCNX_FORWARDING_STRATEGY_H */
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 8cebc00..312404d 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -29,27 +29,22 @@
 #include "ns3/trace-source-accessor.h"
 #include "ns3/object-vector.h"
 #include "ns3/pointer.h"
-#include "ns3/boolean.h"
-#include "ns3/string.h"
 #include "ns3/simulator.h"
 #include "ns3/random-variable.h"
 
 #include "ns3/ccnx-header-helper.h"
+#include "ns3/ccnx-pit.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
 
-#include "ccnx-face.h"
-#include "ccnx-forwarding-strategy.h"
-#include "ccnx-interest-header.h"
-#include "ccnx-content-object-header.h"
-#include "ccnx-fib-impl.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-forwarding-strategy.h"
+
+// #include "fib/ccnx-fib-impl.h"
 
 #include "ccnx-net-device-face.h"
 
 #include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-
-using namespace boost::tuples;
-namespace ll = boost::lambda;
 
 NS_LOG_COMPONENT_DEFINE ("CcnxL3Protocol");
 
@@ -71,15 +66,6 @@
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&CcnxL3Protocol::m_faces),
                    MakeObjectVectorChecker<CcnxFace> ())
-
-    .AddAttribute ("EnableNACKs", "Enabling support of NACKs",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&CcnxL3Protocol::m_nacksEnabled),
-                   MakeBooleanChecker ())
-    .AddAttribute ("CacheUnsolicitedData", "Cache overheard data that have not been requested",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&CcnxL3Protocol::m_cacheUnsolicitedData),
-                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -108,26 +94,28 @@
       m_node = GetObject<Node> ();
       if (m_node != 0)
         {
-          NS_ASSERT_MSG (m_pit != 0 && m_fib != 0 && m_contentStore != 0 && m_forwardingStrategy != 0,
-                         "PIT, FIB, and ContentStore should be aggregated before CcnxL3Protocol");
+          // NS_ASSERT_MSG (m_pit != 0 && m_fib != 0 && m_contentStore != 0 && m_forwardingStrategy != 0,
+          //                "PIT, FIB, and ContentStore should be aggregated before CcnxL3Protocol");
+          NS_ASSERT_MSG (m_forwardingStrategy != 0,
+                         "Forwarding strategy should be aggregated before CcnxL3Protocol");
         }
     }
-  if (m_pit == 0)
-    {
-      m_pit = GetObject<CcnxPit> ();
-    }
-  if (m_fib == 0)
-    {
-      m_fib = GetObject<CcnxFib> ();
-    }
+  // if (m_pit == 0)
+  //   {
+  //     m_pit = GetObject<CcnxPit> ();
+  //   }
+  // if (m_fib == 0)
+  //   {
+  //     m_fib = GetObject<CcnxFib> ();
+  //   }
   if (m_forwardingStrategy == 0)
     {
       m_forwardingStrategy = GetObject<CcnxForwardingStrategy> ();
     }
-  if (m_contentStore == 0)
-    {
-      m_contentStore = GetObject<CcnxContentStore> ();
-    }
+  // if (m_contentStore == 0)
+  //   {
+  //     m_contentStore = GetObject<CcnxContentStore> ();
+  //   }
 
   Object::NotifyNewAggregate ();
 }
@@ -146,9 +134,6 @@
 
   // Force delete on objects
   m_forwardingStrategy = 0; // there is a reference to PIT stored in here
-  m_pit = 0;
-  m_contentStore = 0;
-  m_fib = 0;
 
   Object::DoDispose ();
 }
@@ -173,10 +158,11 @@
 {
   // ask face to register in lower-layer stack
   face->RegisterProtocolHandler (MakeNullCallback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>&> ());
+  Ptr<CcnxPit> pit = GetObject<CcnxPit> ();
 
   // just to be on a safe side. Do the process in two steps
   std::list< Ptr<CcnxPitEntry> > entriesToRemoves;
-  for (Ptr<CcnxPitEntry> pitEntry = m_pit->Begin (); pitEntry != 0; pitEntry = m_pit->Next (pitEntry))
+  for (Ptr<CcnxPitEntry> pitEntry = pit->Begin (); pitEntry != 0; pitEntry = pit->Next (pitEntry))
     {
       pitEntry->RemoveAllReferencesToFace (face);
       
@@ -190,7 +176,7 @@
     }
   BOOST_FOREACH (Ptr<CcnxPitEntry> removedEntry, entriesToRemoves)
     {
-      m_pit->MarkErased (removedEntry);
+      pit->MarkErased (removedEntry);
     }
 
   CcnxFaceList::iterator face_it = find (m_faces.begin(), m_faces.end(), face);
@@ -254,10 +240,11 @@
             packet->RemoveHeader (*header);
             NS_ASSERT_MSG (packet->GetSize () == 0, "Payload of Interests should be zero");
 
-            if (header->GetNack () > 0)
-              OnNack (face, header, p/*original packet*/);
-            else
-              OnInterest (face, header, p/*original packet*/);  
+            m_forwardingStrategy->OnInterest (face, header, p/*original packet*/);
+            // if (header->GetNack () > 0)
+            //   OnNack (face, header, p/*original packet*/);
+            // else
+            //   OnInterest (face, header, p/*original packet*/);  
             break;
           }
         case CcnxHeaderHelper::CONTENT_OBJECT:
@@ -270,7 +257,7 @@
             packet->RemoveHeader (*header);
             packet->RemoveTrailer (contentObjectTrailer);
 
-            OnData (face, header, packet/*payload*/, p/*original packet*/);  
+            m_forwardingStrategy->OnData (face, header, packet/*payload*/, p/*original packet*/);  
             break;
           }
         }
@@ -285,405 +272,405 @@
     }
 }
 
-void
-CcnxL3Protocol::OnNack (const Ptr<CcnxFace> &incomingFace,
-                        Ptr<CcnxInterestHeader> &header,
-                        const Ptr<const Packet> &packet)
-{
-  NS_LOG_FUNCTION (incomingFace << header << packet);
-  m_inNacks (header, incomingFace);
+// void
+// CcnxL3Protocol::OnNack (const Ptr<CcnxFace> &incomingFace,
+//                         Ptr<CcnxInterestHeader> &header,
+//                         const Ptr<const Packet> &packet)
+// {
+//   NS_LOG_FUNCTION (incomingFace << header << packet);
+//   m_inNacks (header, incomingFace);
 
-  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
-  if (pitEntry == 0)
-    {
-      // somebody is doing something bad
-      m_dropNacks (header, NON_DUPLICATED, incomingFace);
-      return;
-    }
+//   Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+//   if (pitEntry == 0)
+//     {
+//       // somebody is doing something bad
+//       m_dropNacks (header, NON_DUPLICATED, incomingFace);
+//       return;
+//     }
   
-  // CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry->GetIncoming ().find (incomingFace);
-  CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
+//   // CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry->GetIncoming ().find (incomingFace);
+//   CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
 
-  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.GetOutgoing ().size ());
+//   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.GetOutgoing ().size ());
       
-      // m_dropNacks (header, NON_DUPLICATE, incomingFace);
-      return;
-    }
+//       // m_dropNacks (header, NON_DUPLICATE, incomingFace);
+//       return;
+//     }
 
-  // This was done in error. Never, never do anything, except normal leakage. This way we ensure that we will not have losses,
-  // at least when there is only one client
-  //
-  // incomingFace->LeakBucketByOnePacket ();
+//   // This was done in error. Never, never do anything, except normal leakage. This way we ensure that we will not have losses,
+//   // at least when there is only one client
+//   //
+//   // incomingFace->LeakBucketByOnePacket ();
 
-  NS_LOG_ERROR ("Nack on " << boost::cref(*incomingFace));
+//   NS_LOG_ERROR ("Nack on " << boost::cref(*incomingFace));
   
-  pitEntry->SetWaitingInVain (outFace);
+//   pitEntry->SetWaitingInVain (outFace);
 
-  // If NACK is NACK_GIVEUP_PIT, then neighbor gave up trying to and removed it's PIT entry.
-  // So, if we had an incoming entry to this neighbor, then we can remove it now
+//   // If NACK is NACK_GIVEUP_PIT, then neighbor gave up trying to and removed it's PIT entry.
+//   // So, if we had an incoming entry to this neighbor, then we can remove it now
 
-  if (header->GetNack () == CcnxInterestHeader::NACK_GIVEUP_PIT)
-    {
-      pitEntry->RemoveIncoming (incomingFace);
-    }
+//   if (header->GetNack () == CcnxInterestHeader::NACK_GIVEUP_PIT)
+//     {
+//       pitEntry->RemoveIncoming (incomingFace);
+//     }
 
-  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));
+//   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->GetIncoming ().size () == 0) // interest was actually satisfied
-    {
-      // no need to do anything
-      m_dropNacks (header, AFTER_SATISFIED, incomingFace);
-      return;
-    }
+//   if (pitEntry->GetIncoming ().size () == 0) // interest was actually satisfied
+//     {
+//       // no need to do anything
+//       m_dropNacks (header, AFTER_SATISFIED, incomingFace);
+//       return;
+//     }
 
-  if (!pitEntry->AreAllOutgoingInVain ()) // not all ougtoing are in vain
-    {
-      NS_LOG_DEBUG ("Not all outgoing are in vain");
-      // suppress
-      // Don't do anything, we are still expecting data from some other face
-      m_dropNacks (header, SUPPRESSED, incomingFace);
-      return;
-    }
+//   if (!pitEntry->AreAllOutgoingInVain ()) // not all ougtoing are in vain
+//     {
+//       NS_LOG_DEBUG ("Not all outgoing are in vain");
+//       // suppress
+//       // Don't do anything, we are still expecting data from some other face
+//       m_dropNacks (header, SUPPRESSED, incomingFace);
+//       return;
+//     }
   
-  Ptr<Packet> nonNackInterest = Create<Packet> ();
-  header->SetNack (CcnxInterestHeader::NORMAL_INTEREST);
-  nonNackInterest->AddHeader (*header);
+//   Ptr<Packet> nonNackInterest = Create<Packet> ();
+//   header->SetNack (CcnxInterestHeader::NORMAL_INTEREST);
+//   nonNackInterest->AddHeader (*header);
   
-  bool propagated = m_forwardingStrategy->
-    PropagateInterest (pitEntry, incomingFace, header, nonNackInterest);
+//   bool propagated = m_forwardingStrategy->
+//     PropagateInterest (pitEntry, incomingFace, header, nonNackInterest);
 
-  // // ForwardingStrategy will try its best to forward packet to at least one interface.
-  // // If no interests was propagated, then there is not other option for forwarding or
-  // // ForwardingStrategy failed to find it. 
-  if (!propagated)
-    {
-      m_dropNacks (header, NO_FACES, incomingFace); // this headers doesn't have NACK flag set
-      GiveUpInterest (pitEntry, header);
-    }
-}
+//   // // ForwardingStrategy will try its best to forward packet to at least one interface.
+//   // // If no interests was propagated, then there is not other option for forwarding or
+//   // // ForwardingStrategy failed to find it. 
+//   if (!propagated)
+//     {
+//       m_dropNacks (header, NO_FACES, incomingFace); // this headers doesn't have NACK flag set
+//       GiveUpInterest (pitEntry, header);
+//     }
+// }
 
 // Processing Interests
 //
-// !!! Key point.
-// !!! All interests should be answerred!!! Either later with data, immediately with data, or immediately with NACK
-void CcnxL3Protocol::OnInterest (const Ptr<CcnxFace> &incomingFace,
-                                 Ptr<CcnxInterestHeader> &header,
-                                 const Ptr<const Packet> &packet)
-{
-  m_inInterests (header, incomingFace);
+// // !!! Key point.
+// // !!! All interests should be answerred!!! Either later with data, immediately with data, or immediately with NACK
+// void CcnxL3Protocol::OnInterest (const Ptr<CcnxFace> &incomingFace,
+//                                  Ptr<CcnxInterestHeader> &header,
+//                                  const Ptr<const Packet> &packet)
+// {
+//   m_inInterests (header, incomingFace);
 
-  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
-  if (pitEntry == 0)
-    {
-      pitEntry = m_pit->Create (header);
-    }
+//   Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+//   if (pitEntry == 0)
+//     {
+//       pitEntry = m_pit->Create (header);
+//     }
 
-  if (pitEntry == 0)
-    {
-      // if it is still not created, then give up processing
-      m_dropInterests (header, PIT_LIMIT, incomingFace);
-      return;
-    }
+//   if (pitEntry == 0)
+//     {
+//       // if it is still not created, then give up processing
+//       m_dropInterests (header, PIT_LIMIT, incomingFace);
+//       return;
+//     }
   
-  bool isNew = pitEntry->GetIncoming ().size () == 0 && pitEntry->GetOutgoing ().size () == 0;
-  bool isDuplicated = true;
-  if (!pitEntry->IsNonceSeen (header->GetNonce ()))
-    {
-      pitEntry->AddSeenNonce (header->GetNonce ());
-      isDuplicated = false;
-    }
+//   bool isNew = pitEntry->GetIncoming ().size () == 0 && pitEntry->GetOutgoing ().size () == 0;
+//   bool isDuplicated = true;
+//   if (!pitEntry->IsNonceSeen (header->GetNonce ()))
+//     {
+//       pitEntry->AddSeenNonce (header->GetNonce ());
+//       isDuplicated = false;
+//     }
 
-  NS_LOG_FUNCTION (header->GetName () << header->GetNonce () << boost::cref (*incomingFace) << isDuplicated);
+//   NS_LOG_FUNCTION (header->GetName () << header->GetNonce () << boost::cref (*incomingFace) << isDuplicated);
 
-  /////////////////////////////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////////////////////////////
-  //                                                                                     //
-  // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
-  //                                                                                     //
-  /////////////////////////////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////////////////////////
+//   //                                                                                     //
+//   // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
+//   //                                                                                     //
+//   /////////////////////////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////////////////////////
   
-  // Data is not in cache
-  CcnxPitEntry::in_iterator inFace   = pitEntry->GetIncoming ().find (incomingFace);
-  CcnxPitEntry::out_iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
+//   // Data is not in cache
+//   CcnxPitEntry::in_iterator inFace   = pitEntry->GetIncoming ().find (incomingFace);
+//   CcnxPitEntry::out_iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
 
-  bool isRetransmitted = false;
+//   bool isRetransmitted = false;
   
-  if (inFace != pitEntry->GetIncoming ().end ())
-    {
-      // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
+//   if (inFace != pitEntry->GetIncoming ().end ())
+//     {
+//       // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
 
-      isRetransmitted = true;
-      // this is almost definitely a retransmission. But should we trust the user on that?
-    }
-  else
-    {
-      inFace = pitEntry->AddIncoming (incomingFace);
-    }
-  //////////////////////////////////////////////////////////////////////////////////
-  //////////////////////////////////////////////////////////////////////////////////
-  //////////////////////////////////////////////////////////////////////////////////
+//       isRetransmitted = true;
+//       // this is almost definitely a retransmission. But should we trust the user on that?
+//     }
+//   else
+//     {
+//       inFace = pitEntry->AddIncoming (incomingFace);
+//     }
+//   //////////////////////////////////////////////////////////////////////////////////
+//   //////////////////////////////////////////////////////////////////////////////////
+//   //////////////////////////////////////////////////////////////////////////////////
   
-  if (isDuplicated) 
-    {
-      NS_LOG_DEBUG ("Received duplicatie interest on " << *incomingFace);
-      m_dropInterests (header, DUPLICATED, incomingFace);
+//   if (isDuplicated) 
+//     {
+//       NS_LOG_DEBUG ("Received duplicatie interest on " << *incomingFace);
+//       m_dropInterests (header, DUPLICATED, incomingFace);
 
-      /**
-       * This condition will handle "routing" loops and also recently satisfied interests.
-       * Every time interest is satisfied, PIT entry (with empty incoming and outgoing faces)
-       * is kept for another small chunk of time.
-       */
+//       /**
+//        * This condition will handle "routing" loops and also recently satisfied interests.
+//        * Every time interest is satisfied, PIT entry (with empty incoming and outgoing faces)
+//        * is kept for another small chunk of time.
+//        */
 
-      if (m_nacksEnabled)
-        {
-          NS_LOG_DEBUG ("Sending NACK_LOOP");
-          header->SetNack (CcnxInterestHeader::NACK_LOOP);
-          Ptr<Packet> nack = Create<Packet> ();
-          nack->AddHeader (*header);
+//       if (m_nacksEnabled)
+//         {
+//           NS_LOG_DEBUG ("Sending NACK_LOOP");
+//           header->SetNack (CcnxInterestHeader::NACK_LOOP);
+//           Ptr<Packet> nack = Create<Packet> ();
+//           nack->AddHeader (*header);
 
-          incomingFace->Send (nack);
-          m_outNacks (header, incomingFace);
-        }
+//           incomingFace->Send (nack);
+//           m_outNacks (header, incomingFace);
+//         }
       
-      return;
-    }
+//       return;
+//     }
 
-  Ptr<Packet> contentObject;
-  Ptr<const CcnxContentObjectHeader> contentObjectHeader; // used for tracing
-  Ptr<const Packet> payload; // used for tracing
-  tie (contentObject, contentObjectHeader, payload) = m_contentStore->Lookup (header);
-  if (contentObject != 0)
-    {
-      NS_ASSERT (contentObjectHeader != 0);      
-      NS_LOG_LOGIC("Found in cache");
+//   Ptr<Packet> contentObject;
+//   Ptr<const CcnxContentObjectHeader> contentObjectHeader; // used for tracing
+//   Ptr<const Packet> payload; // used for tracing
+//   tie (contentObject, contentObjectHeader, payload) = m_contentStore->Lookup (header);
+//   if (contentObject != 0)
+//     {
+//       NS_ASSERT (contentObjectHeader != 0);      
+//       NS_LOG_LOGIC("Found in cache");
 
-      OnDataDelayed (contentObjectHeader, payload, contentObject);
-      return;
-    }
+//       OnDataDelayed (contentObjectHeader, payload, contentObject);
+//       return;
+//     }
 
-  // update PIT entry lifetime
-  pitEntry->UpdateLifetime (header->GetInterestLifetime ());
+//   // update PIT entry lifetime
+//   pitEntry->UpdateLifetime (header->GetInterestLifetime ());
   
-  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
-      // Probably, there is no point in waiting data from that face... Not sure yet
+//   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
+//       // Probably, there is no point in waiting data from that face... Not sure yet
 
-      // If we're expecting data from the interface we got the interest from ("producer" asks us for "his own" data)
-      // Mark interface YELLOW, but keep a small hope that data will come eventually.
+//       // If we're expecting data from the interface we got the interest from ("producer" asks us for "his own" data)
+//       // Mark interface YELLOW, but keep a small hope that data will come eventually.
 
-      // ?? not sure if we need to do that ?? ...
+//       // ?? not sure if we need to do that ?? ...
       
-      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));
-    }
-  else
-    if (!isNew && !isRetransmitted)
-      {
-        // Suppress this interest if we're still expecting data from some other face
-        NS_LOG_DEBUG ("Suppress interests");
-        m_dropInterests (header, SUPPRESSED, incomingFace);
-        return;
-      }
+//       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));
+//     }
+//   else
+//     if (!isNew && !isRetransmitted)
+//       {
+//         // Suppress this interest if we're still expecting data from some other face
+//         NS_LOG_DEBUG ("Suppress interests");
+//         m_dropInterests (header, SUPPRESSED, incomingFace);
+//         return;
+//       }
   
-  /////////////////////////////////////////////////////////////////////
-  // Propagate
-  /////////////////////////////////////////////////////////////////////
+//   /////////////////////////////////////////////////////////////////////
+//   // Propagate
+//   /////////////////////////////////////////////////////////////////////
   
-  bool propagated = m_forwardingStrategy->
-    PropagateInterest (pitEntry, incomingFace, header, packet);
+//   bool propagated = m_forwardingStrategy->
+//     PropagateInterest (pitEntry, incomingFace, header, packet);
 
-  if (!propagated && isRetransmitted) //give another chance if retransmitted
-    {
-      // increase max number of allowed retransmissions
-      pitEntry->IncreaseAllowedRetxCount ();
+//   if (!propagated && isRetransmitted) //give another chance if retransmitted
+//     {
+//       // increase max number of allowed retransmissions
+//       pitEntry->IncreaseAllowedRetxCount ();
 
-      // try again
-      propagated = m_forwardingStrategy->
-        PropagateInterest (pitEntry, incomingFace, header, packet);
-    }
+//       // try again
+//       propagated = m_forwardingStrategy->
+//         PropagateInterest (pitEntry, incomingFace, header, packet);
+//     }
   
-  // ForwardingStrategy will try its best to forward packet to at least one interface.
-  // If no interests was propagated, then there is not other option for forwarding or
-  // ForwardingStrategy failed to find it. 
-  if (!propagated)
-    {
-      NS_LOG_DEBUG ("Not propagated");
-      m_dropInterests (header, NO_FACES, incomingFace);
-      GiveUpInterest (pitEntry, header);
-    }
-}
+//   // ForwardingStrategy will try its best to forward packet to at least one interface.
+//   // If no interests was propagated, then there is not other option for forwarding or
+//   // ForwardingStrategy failed to find it. 
+//   if (!propagated)
+//     {
+//       NS_LOG_DEBUG ("Not propagated");
+//       m_dropInterests (header, NO_FACES, incomingFace);
+//       GiveUpInterest (pitEntry, header);
+//     }
+// }
 
-void
-CcnxL3Protocol::OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
-                               Ptr<const Packet> payload,
-                               const Ptr<const Packet> &packet)
-{
-  // 1. Lookup PIT entry
-  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
-  if (pitEntry != 0)
-    {
-      //satisfy all pending incoming Interests
-      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->GetIncoming ())
-        {
-          incoming.m_face->Send (packet->Copy ());
-          m_outData (header, payload, false, incoming.m_face);
-          NS_LOG_DEBUG ("Satisfy " << *incoming.m_face);
+// void
+// CcnxL3Protocol::OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+//                                Ptr<const Packet> payload,
+//                                const Ptr<const Packet> &packet)
+// {
+//   // 1. Lookup PIT entry
+//   Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+//   if (pitEntry != 0)
+//     {
+//       //satisfy all pending incoming Interests
+//       BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->GetIncoming ())
+//         {
+//           incoming.m_face->Send (packet->Copy ());
+//           m_outData (header, payload, false, incoming.m_face);
+//           NS_LOG_DEBUG ("Satisfy " << *incoming.m_face);
           
-          // successfull forwarded data trace
-        }
+//           // successfull forwarded data trace
+//         }
 
-      if (pitEntry->GetIncoming ().size () > 0)
-        {
-          // All incoming interests are satisfied. Remove them
-          pitEntry->ClearIncoming ();
+//       if (pitEntry->GetIncoming ().size () > 0)
+//         {
+//           // All incoming interests are satisfied. Remove them
+//           pitEntry->ClearIncoming ();
 
-          // Remove all outgoing faces
-          pitEntry->ClearOutgoing ();
+//           // Remove all outgoing faces
+//           pitEntry->ClearOutgoing ();
           
-          // Set pruning timout on PIT entry (instead of deleting the record)
-          m_pit->MarkErased (pitEntry);
-        }
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Pit entry not found (was satisfied and removed before)");
-      return; // do not process unsoliced data packets
-    }
-}
+//           // Set pruning timout on PIT entry (instead of deleting the record)
+//           m_pit->MarkErased (pitEntry);
+//         }
+//     }
+//   else
+//     {
+//       NS_LOG_DEBUG ("Pit entry not found (was satisfied and removed before)");
+//       return; // do not process unsoliced data packets
+//     }
+// }
 
-// Processing ContentObjects
-void
-CcnxL3Protocol::OnData (const Ptr<CcnxFace> &incomingFace,
-                        Ptr<CcnxContentObjectHeader> &header,
-                        Ptr<Packet> &payload,
-                        const Ptr<const Packet> &packet)
-{
+// // Processing ContentObjects
+// void
+// CcnxL3Protocol::OnData (const Ptr<CcnxFace> &incomingFace,
+//                         Ptr<CcnxContentObjectHeader> &header,
+//                         Ptr<Packet> &payload,
+//                         const Ptr<const Packet> &packet)
+// {
     
-  NS_LOG_FUNCTION (incomingFace << header->GetName () << payload << packet);
-  m_inData (header, payload, incomingFace);
+//   NS_LOG_FUNCTION (incomingFace << header->GetName () << payload << packet);
+//   m_inData (header, payload, incomingFace);
   
-  // 1. Lookup PIT entry
-  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
-  if (pitEntry != 0)
-    {
-      // Note that with MultiIndex we need to modify entries indirectly
+//   // 1. Lookup PIT entry
+//   Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+//   if (pitEntry != 0)
+//     {
+//       // Note that with MultiIndex we need to modify entries indirectly
 
-      CcnxPitEntry::out_iterator out = pitEntry->GetOutgoing ().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->GetOutgoing ().end ())
-        {
-          pitEntry->GetFibEntry ()->UpdateFaceRtt (incomingFace, Simulator::Now () - out->m_sendTime);
-          // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->GetFibEntry (),
-          //                                          ll::bind (&CcnxFibEntry::UpdateFaceRtt,
-          //                                                    ll::_1,
-          //                                                    incomingFace,
-          //                                                    Simulator::Now () - out->m_sendTime));
-        }
-      else
-        {
-          // Unsolicited data, but we're interested in it... should we get it?
-          // Potential hole for attacks
+//       // If we have sent interest for this data via this face, then update stats.
+//       if (out != pitEntry->GetOutgoing ().end ())
+//         {
+//           pitEntry->GetFibEntry ()->UpdateFaceRtt (incomingFace, Simulator::Now () - out->m_sendTime);
+//           // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->GetFibEntry (),
+//           //                                          ll::bind (&CcnxFibEntry::UpdateFaceRtt,
+//           //                                                    ll::_1,
+//           //                                                    incomingFace,
+//           //                                                    Simulator::Now () - out->m_sendTime));
+//         }
+//       else
+//         {
+//           // Unsolicited data, but we're interested in it... should we get it?
+//           // Potential hole for attacks
 
-          if (m_cacheUnsolicitedData)
-            {
-              // Optimistically add or update entry in the content store
-              m_contentStore->Add (header, payload);
-            }
-          else
-            {
-              NS_LOG_ERROR ("Node "<< m_node->GetId() <<
-                            ". PIT entry for "<< header->GetName ()<<" is valid, "
-                            "but outgoing entry for interface "<< boost::cref(*incomingFace) <<" doesn't exist\n");
-            }
-          // ignore unsolicited data
-          return;
-        }
+//           if (m_cacheUnsolicitedData)
+//             {
+//               // Optimistically add or update entry in the content store
+//               m_contentStore->Add (header, payload);
+//             }
+//           else
+//             {
+//               NS_LOG_ERROR ("Node "<< m_node->GetId() <<
+//                             ". PIT entry for "<< header->GetName ()<<" is valid, "
+//                             "but outgoing entry for interface "<< boost::cref(*incomingFace) <<" doesn't exist\n");
+//             }
+//           // ignore unsolicited data
+//           return;
+//         }
 
-      // Update metric status for the incoming interface in the corresponding FIB entry
-      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));
+//       // Update metric status for the incoming interface in the corresponding FIB entry
+//       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));
   
-      // Add or update entry in the content store
-      m_contentStore->Add (header, payload);
+//       // Add or update entry in the content store
+//       m_contentStore->Add (header, payload);
 
-      pitEntry->RemoveIncoming (incomingFace);
+//       pitEntry->RemoveIncoming (incomingFace);
 
-      if (pitEntry->GetIncoming ().size () == 0)
-        {
-          // Set pruning timout on PIT entry (instead of deleting the record)
-          m_pit->MarkErased (pitEntry);
-        }
-      else
-        {
-          OnDataDelayed (header, payload, packet);
-        }
-    }
-  else
-    {
-      NS_LOG_DEBUG ("Pit entry not found");
-      if (m_cacheUnsolicitedData)
-        {
-          // Optimistically add or update entry in the content store
-          m_contentStore->Add (header, payload);
-        }
-      else
-        {
-          // Drop data packet if PIT entry is not found
-          // (unsolicited data packets should not "poison" content store)
+//       if (pitEntry->GetIncoming ().size () == 0)
+//         {
+//           // Set pruning timout on PIT entry (instead of deleting the record)
+//           m_pit->MarkErased (pitEntry);
+//         }
+//       else
+//         {
+//           OnDataDelayed (header, payload, packet);
+//         }
+//     }
+//   else
+//     {
+//       NS_LOG_DEBUG ("Pit entry not found");
+//       if (m_cacheUnsolicitedData)
+//         {
+//           // Optimistically add or update entry in the content store
+//           m_contentStore->Add (header, payload);
+//         }
+//       else
+//         {
+//           // Drop data packet if PIT entry is not found
+//           // (unsolicited data packets should not "poison" content store)
       
-          //drop dulicated or not requested data packet
-          m_dropData (header, payload, UNSOLICITED, incomingFace);
-        }
-      return; // do not process unsoliced data packets
-    }
-}
+//           //drop dulicated or not requested data packet
+//           m_dropData (header, payload, UNSOLICITED, incomingFace);
+//         }
+//       return; // do not process unsoliced data packets
+//     }
+// }
 
-void
-CcnxL3Protocol::GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
-                                Ptr<CcnxInterestHeader> header)
-{
-  NS_LOG_FUNCTION (this);
+// void
+// CcnxL3Protocol::GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
+//                                 Ptr<CcnxInterestHeader> header)
+// {
+//   NS_LOG_FUNCTION (this);
 
-  if (m_nacksEnabled)
-    {
-      Ptr<Packet> packet = Create<Packet> ();
-      header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
-      packet->AddHeader (*header);
+//   if (m_nacksEnabled)
+//     {
+//       Ptr<Packet> packet = Create<Packet> ();
+//       header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
+//       packet->AddHeader (*header);
 
-      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 ());
+//       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 ());
 
-          m_outNacks (header, incoming.m_face);
-        }
+//           m_outNacks (header, incoming.m_face);
+//         }
   
-      // All incoming interests cannot be satisfied. Remove them
-      pitEntry->ClearIncoming ();
+//       // All incoming interests cannot be satisfied. Remove them
+//       pitEntry->ClearIncoming ();
 
-      // Remove also outgoing
-      pitEntry->ClearOutgoing ();
+//       // Remove also outgoing
+//       pitEntry->ClearOutgoing ();
   
-      // Set pruning timout on PIT entry (instead of deleting the record)
-      m_pit->MarkErased (pitEntry);
-    }
-}
+//       // Set pruning timout on PIT entry (instead of deleting the record)
+//       m_pit->MarkErased (pitEntry);
+//     }
+// }
 
 } //namespace ns3
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 9731c8e..3525db5 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -28,9 +28,9 @@
 #include "ns3/net-device.h"
 #include "ns3/nstime.h"
 
-#include "ccnx-content-store.h"
-#include "ccnx-pit.h"
-#include "ccnx-fib.h"
+// #include "ccnx-content-store.h"
+// #include "ccnx-pit.h"
+// #include "ccnx-fib.h"
 
 #include "ccnx.h"
 
@@ -106,46 +106,46 @@
   void
   Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p);
 
-  /**
-   * \brief Actual processing of incoming CCNx interests. Note, interests do not have payload
-   * 
-   * Processing Interest packets
-   * @param face    incoming face
-   * @param header  deserialized Interest header
-   * @param packet  original packet
-   */
-  void
-  OnInterest (const Ptr<CcnxFace> &face,
-              Ptr<CcnxInterestHeader> &header,
-              const Ptr<const Packet> &p);
+  // /**
+  //  * \brief Actual processing of incoming CCNx interests. Note, interests do not have payload
+  //  * 
+  //  * Processing Interest packets
+  //  * @param face    incoming face
+  //  * @param header  deserialized Interest header
+  //  * @param packet  original packet
+  //  */
+  // void
+  // OnInterest (const Ptr<CcnxFace> &face,
+  //             Ptr<CcnxInterestHeader> &header,
+  //             const Ptr<const Packet> &p);
 
-  /**
-   * \brief Processing of incoming CCNx NACKs. Note, these packets, like interests, do not have payload
-   * 
-   * Processing NACK packets
-   * @param face    incoming face
-   * @param header  deserialized Interest header
-   * @param packet  original packet
-   */
-  void
-  OnNack (const Ptr<CcnxFace> &face,
-          Ptr<CcnxInterestHeader> &header,
-          const Ptr<const Packet> &p);
+  // /**
+  //  * \brief Processing of incoming CCNx NACKs. Note, these packets, like interests, do not have payload
+  //  * 
+  //  * Processing NACK packets
+  //  * @param face    incoming face
+  //  * @param header  deserialized Interest header
+  //  * @param packet  original packet
+  //  */
+  // void
+  // OnNack (const Ptr<CcnxFace> &face,
+  //         Ptr<CcnxInterestHeader> &header,
+  //         const Ptr<const Packet> &p);
   
-  /**
-   * \brief Actual processing of incoming CCNx content objects
-   * 
-   * Processing ContentObject packets
-   * @param face    incoming face
-   * @param header  deserialized ContentObject header
-   * @param payload data packet payload
-   * @param packet  original packet
-   */
-  void
-  OnData (const Ptr<CcnxFace> &face,
-          Ptr<CcnxContentObjectHeader> &header,
-          Ptr<Packet> &payload,
-          const Ptr<const Packet> &packet);
+  // /**
+  //  * \brief Actual processing of incoming CCNx content objects
+  //  * 
+  //  * Processing ContentObject packets
+  //  * @param face    incoming face
+  //  * @param header  deserialized ContentObject header
+  //  * @param payload data packet payload
+  //  * @param packet  original packet
+  //  */
+  // void
+  // OnData (const Ptr<CcnxFace> &face,
+  //         Ptr<CcnxContentObjectHeader> &header,
+  //         Ptr<Packet> &payload,
+  //         const Ptr<const Packet> &packet);
 
 protected:
   virtual void DoDispose (void); ///< @brief Do cleanup
@@ -160,14 +160,14 @@
   CcnxL3Protocol(const CcnxL3Protocol &); ///< copy constructor is disabled
   CcnxL3Protocol &operator = (const CcnxL3Protocol &); ///< copy operator is disabled
 
-  void
-  GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
-                  Ptr<CcnxInterestHeader> header);
+  // void
+  // GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
+  //                 Ptr<CcnxInterestHeader> header);
 
-  void
-  OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
-                 Ptr<const Packet> payload,
-                 const Ptr<const Packet> &packet);
+  // void
+  // OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+  //                Ptr<const Packet> payload,
+  //                const Ptr<const Packet> &packet);
   
 private:
   uint32_t m_faceCounter; ///< \brief counter of faces. Increased every time a new face is added to the stack
@@ -177,12 +177,9 @@
   // These objects are aggregated, but for optimization, get them here
   Ptr<Node> m_node; ///< \brief node on which ccnx stack is installed
   Ptr<CcnxForwardingStrategy> m_forwardingStrategy; ///< \brief smart pointer to the selected forwarding strategy
-  Ptr<CcnxPit> m_pit; ///< \brief PIT (pending interest table)
-  Ptr<CcnxFib> m_fib; ///< \brief FIB  
-  Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
 
-  bool m_nacksEnabled;
-  bool m_cacheUnsolicitedData;
+  // bool m_nacksEnabled;
+  // bool m_cacheUnsolicitedData;
 };
   
 } // Namespace ns3
diff --git a/model/ccnx.cc b/model/ccnx.cc
index 2e30e7f..79452bf 100644
--- a/model/ccnx.cc
+++ b/model/ccnx.cc
@@ -24,7 +24,7 @@
 
 #include "ccnx.h"
 #include "ccnx-face.h"
-#include "ccnx-forwarding-strategy.h"
+#include "forwarding-strategy/ccnx-forwarding-strategy.h"
 #include "ccnx-interest-header.h"
 #include "ccnx-content-object-header.h"
 
@@ -38,29 +38,6 @@
   static TypeId tid = TypeId ("ns3::Ccnx")
     .SetGroupName ("Ccnx")
     .SetParent<Object> ()
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    // "OutInterests" trace is inside CcnxForwardingStrategy
-    .AddTraceSource ("InInterests",   "InInterests",   MakeTraceSourceAccessor (&Ccnx::m_inInterests))
-    .AddTraceSource ("DropInterests", "DropInterests", MakeTraceSourceAccessor (&Ccnx::m_dropInterests))
-    
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("OutNacks",  "OutNacks",  MakeTraceSourceAccessor (&Ccnx::m_outNacks))
-    .AddTraceSource ("InNacks",   "InNacks",   MakeTraceSourceAccessor (&Ccnx::m_inNacks))
-    .AddTraceSource ("DropNacks", "DropNacks", MakeTraceSourceAccessor (&Ccnx::m_dropNacks))
-    
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("OutData",  "OutData",  MakeTraceSourceAccessor (&Ccnx::m_outData))
-    .AddTraceSource ("InData",   "InData",   MakeTraceSourceAccessor (&Ccnx::m_inData))
-    .AddTraceSource ("DropData", "DropData", MakeTraceSourceAccessor (&Ccnx::m_dropData))
-    
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
   ;
   return tid;
 }
diff --git a/model/ccnx.h b/model/ccnx.h
index 573a567..ca36c1f 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -131,64 +131,21 @@
   virtual Ptr<CcnxFace>
   GetFaceByNetDevice (Ptr<NetDevice> netDevice) const = 0;
 
-  /**
-   * \enum DropReason
-   * \brief A reason why the packet has been dropped
-   */
-  enum DropReason
-    {
-      DUPLICATED, // Interests
-      SUPPRESSED, // Interests and Nacks
-      NO_FACES,    // Interests
-      NON_DUPLICATED, // Nacks
-      AFTER_SATISFIED, // Nacks
-      UNSOLICITED,      // data
-      PIT_LIMIT         // PIT limit reached
-    };
-  
-protected:
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  
-  // transmittedInterestTrace is inside ForwardingStrategy
-  
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_inInterests; ///< @brief trace of incoming Interests
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 DropReason,
-                 Ptr<const CcnxFace> > m_dropInterests; ///< @brief trace of dropped Interests
-  
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_outNacks; ///< @brief trace of outgoing NACKs
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_inNacks; ///< @brief trace of incoming NACKs
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 DropReason,
-                 Ptr<const CcnxFace> > m_dropNacks; ///< @brief trace of dropped NACKs
-
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-
-  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                 bool /*from cache*/,
-                 Ptr<const CcnxFace> > m_outData; ///< @brief trace of outgoing Data
-
-  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                 Ptr<const CcnxFace> > m_inData; ///< @brief trace of incoming Data
-
-  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                  DropReason,
-                  Ptr<const CcnxFace> > m_dropData;  ///< @brief trace of dropped Data
-};
+  // /**
+  //  * \enum DropReason
+  //  * \brief A reason why the packet has been dropped
+  //  */
+  // enum DropReason
+  //   {
+  //     DUPLICATED, // Interests
+  //     SUPPRESSED, // Interests and Nacks
+  //     NO_FACES,    // Interests
+  //     NON_DUPLICATED, // Nacks
+  //     AFTER_SATISFIED, // Nacks
+  //     UNSOLICITED,      // data
+  //     PIT_LIMIT         // PIT limit reached
+  //   };
+  };
 
 } // namespace ns3 
 
diff --git a/model/ccnx-content-store-impl.h b/model/content-store/ccnx-content-store-impl.h
similarity index 100%
rename from model/ccnx-content-store-impl.h
rename to model/content-store/ccnx-content-store-impl.h
diff --git a/model/ccnx-content-store-policies.cc b/model/content-store/ccnx-content-store-policies.cc
similarity index 100%
rename from model/ccnx-content-store-policies.cc
rename to model/content-store/ccnx-content-store-policies.cc
diff --git a/model/ccnx-content-store-policies.h b/model/content-store/ccnx-content-store-policies.h
similarity index 93%
rename from model/ccnx-content-store-policies.h
rename to model/content-store/ccnx-content-store-policies.h
index ca7c3c7..cb8ee10 100644
--- a/model/ccnx-content-store-policies.h
+++ b/model/content-store/ccnx-content-store-policies.h
@@ -26,12 +26,12 @@
 
 #include "ccnx-content-store-impl.h"
 
-#include "../utils/trie.h"
-#include "../utils/trie-with-policy.h"
+#include "../../utils/trie.h"
+#include "../../utils/trie-with-policy.h"
 
-#include "../utils/lru-policy.h"
-#include "../utils/random-policy.h"
-#include "../utils/fifo-policy.h"
+#include "../../utils/lru-policy.h"
+#include "../../utils/random-policy.h"
+#include "../../utils/fifo-policy.h"
 
 namespace  ns3
 {
diff --git a/model/ccnx-content-store.cc b/model/content-store/ccnx-content-store.cc
similarity index 100%
rename from model/ccnx-content-store.cc
rename to model/content-store/ccnx-content-store.cc
diff --git a/model/ccnx-content-store.h b/model/content-store/ccnx-content-store.h
similarity index 100%
rename from model/ccnx-content-store.h
rename to model/content-store/ccnx-content-store.h
diff --git a/model/ccnx-fib-entry.cc b/model/fib/ccnx-fib-entry.cc
similarity index 100%
rename from model/ccnx-fib-entry.cc
rename to model/fib/ccnx-fib-entry.cc
diff --git a/model/ccnx-fib-entry.h b/model/fib/ccnx-fib-entry.h
similarity index 100%
rename from model/ccnx-fib-entry.h
rename to model/fib/ccnx-fib-entry.h
diff --git a/model/ccnx-fib-impl.cc b/model/fib/ccnx-fib-impl.cc
similarity index 98%
rename from model/ccnx-fib-impl.cc
rename to model/fib/ccnx-fib-impl.cc
index 10217e3..107f072 100644
--- a/model/ccnx-fib-impl.cc
+++ b/model/fib/ccnx-fib-impl.cc
@@ -20,9 +20,9 @@
 
 #include "ccnx-fib-impl.h"
 
-#include "ccnx.h"
-#include "ccnx-face.h"
-#include "ccnx-interest-header.h"
+#include "ns3/ccnx.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
 
 #include "ns3/node.h"
 #include "ns3/assert.h"
diff --git a/model/ccnx-fib-impl.h b/model/fib/ccnx-fib-impl.h
similarity index 97%
rename from model/ccnx-fib-impl.h
rename to model/fib/ccnx-fib-impl.h
index eaedeee..d85dcfd 100644
--- a/model/ccnx-fib-impl.h
+++ b/model/fib/ccnx-fib-impl.h
@@ -24,8 +24,8 @@
 #include "ns3/ccnx-fib.h"
 #include "ns3/ccnx-name-components.h"
 
-#include "../utils/trie-with-policy.h"
-#include "../utils/counting-policy.h"
+#include "../../utils/trie-with-policy.h"
+#include "../../utils/counting-policy.h"
 
 namespace ns3 {
 
diff --git a/model/ccnx-fib.cc b/model/fib/ccnx-fib.cc
similarity index 92%
rename from model/ccnx-fib.cc
rename to model/fib/ccnx-fib.cc
index e25f161..fdd1aea 100644
--- a/model/ccnx-fib.cc
+++ b/model/fib/ccnx-fib.cc
@@ -20,13 +20,13 @@
 
 #include "ccnx-fib.h"
 
-#include "ccnx.h"
-#include "ccnx-face.h"
-#include "ccnx-interest-header.h"
-
-#include "ccnx-name-components.h"
 #include "ccnx-fib-impl.h"
 
+#include "ns3/ccnx.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-name-components.h"
+
 #include "ns3/node.h"
 #include "ns3/names.h"
 
diff --git a/model/ccnx-fib.h b/model/fib/ccnx-fib.h
similarity index 100%
rename from model/ccnx-fib.h
rename to model/fib/ccnx-fib.h
diff --git a/model/ccnx-bestroute-strategy.cc b/model/forwarding-strategy/ccnx-bestroute-strategy.cc
similarity index 95%
rename from model/ccnx-bestroute-strategy.cc
rename to model/forwarding-strategy/ccnx-bestroute-strategy.cc
index 6548ae5..75efdd4 100644
--- a/model/ccnx-bestroute-strategy.cc
+++ b/model/forwarding-strategy/ccnx-bestroute-strategy.cc
@@ -21,9 +21,9 @@
 
 #include "ccnx-bestroute-strategy.h"
 
-#include "ccnx-interest-header.h"
-#include "ccnx-pit.h"
-#include "ccnx-pit-entry.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-pit.h"
+#include "ns3/ccnx-pit-entry.h"
 
 #include "ns3/assert.h"
 #include "ns3/log.h"
@@ -106,7 +106,7 @@
 
       //transmission
       metricFace.m_face->Send (packetToSend);
-      m_transmittedInterestsTrace (header, metricFace.m_face);
+      m_outInterests (header, metricFace.m_face);
       
       propagatedCount++;
       break; // do only once
diff --git a/model/ccnx-bestroute-strategy.h b/model/forwarding-strategy/ccnx-bestroute-strategy.h
similarity index 100%
rename from model/ccnx-bestroute-strategy.h
rename to model/forwarding-strategy/ccnx-bestroute-strategy.h
diff --git a/model/ccnx-flooding-strategy.cc b/model/forwarding-strategy/ccnx-flooding-strategy.cc
similarity index 96%
rename from model/ccnx-flooding-strategy.cc
rename to model/forwarding-strategy/ccnx-flooding-strategy.cc
index 3531249..c803560 100644
--- a/model/ccnx-flooding-strategy.cc
+++ b/model/forwarding-strategy/ccnx-flooding-strategy.cc
@@ -20,9 +20,10 @@
  */
 
 #include "ccnx-flooding-strategy.h"
-#include "ccnx-interest-header.h"
-#include "ccnx-pit.h"
-#include "ccnx-pit-entry.h"
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-pit.h"
+#include "ns3/ccnx-pit-entry.h"
 
 #include "ns3/assert.h"
 #include "ns3/log.h"
@@ -119,7 +120,7 @@
 
       //transmission
       metricFace.m_face->Send (packetToSend);
-      m_transmittedInterestsTrace (header, metricFace.m_face);
+      m_outInterests (header, metricFace.m_face);
       
       propagatedCount++;
     }
diff --git a/model/ccnx-flooding-strategy.h b/model/forwarding-strategy/ccnx-flooding-strategy.h
similarity index 100%
rename from model/ccnx-flooding-strategy.h
rename to model/forwarding-strategy/ccnx-flooding-strategy.h
diff --git a/model/forwarding-strategy/ccnx-forwarding-strategy.cc b/model/forwarding-strategy/ccnx-forwarding-strategy.cc
new file mode 100644
index 0000000..9cdfa4d
--- /dev/null
+++ b/model/forwarding-strategy/ccnx-forwarding-strategy.cc
@@ -0,0 +1,494 @@
+/* -*- 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>
+ *          Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+#include "ccnx-forwarding-strategy.h"
+
+#include "ns3/ccnx-pit.h"
+#include "ns3/ccnx-pit-entry.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+#include "ns3/ccnx-pit.h"
+#include "ns3/ccnx-fib.h"
+#include "ns3/ccnx-content-store.h"
+
+#include "ns3/assert.h"
+#include "ns3/ptr.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/boolean.h"
+#include "ns3/string.h"
+
+#include <boost/ref.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+#include <boost/tuple/tuple.hpp>
+namespace ll = boost::lambda;
+
+NS_LOG_COMPONENT_DEFINE ("CcnxForwardingStrategy");
+
+namespace ns3 {
+
+using namespace __ccnx_private;
+
+NS_OBJECT_ENSURE_REGISTERED (CcnxForwardingStrategy);
+
+TypeId CcnxForwardingStrategy::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::CcnxForwardingStrategy")
+    .SetGroupName ("Ccnx")
+    .SetParent<Object> ()
+
+    ////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////
+
+    .AddTraceSource ("OutInterests", "OutInterests",   MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_outInterests))
+    .AddTraceSource ("InInterests",   "InInterests",   MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_inInterests))
+    .AddTraceSource ("DropInterests", "DropInterests", MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_dropInterests))
+    
+    ////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////
+
+    .AddTraceSource ("OutNacks",  "OutNacks",  MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_outNacks))
+    .AddTraceSource ("InNacks",   "InNacks",   MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_inNacks))
+    .AddTraceSource ("DropNacks", "DropNacks", MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_dropNacks))
+    
+    ////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////
+
+    .AddTraceSource ("OutData",  "OutData",  MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_outData))
+    .AddTraceSource ("InData",   "InData",   MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_inData))
+    .AddTraceSource ("DropData", "DropData", MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_dropData))
+
+    .AddAttribute ("EnableNACKs", "Enabling support of NACKs",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&CcnxForwardingStrategy::m_nacksEnabled),
+                   MakeBooleanChecker ())
+    .AddAttribute ("CacheUnsolicitedData", "Cache overheard data that have not been requested",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&CcnxForwardingStrategy::m_cacheUnsolicitedData),
+                   MakeBooleanChecker ())
+
+    ;
+  return tid;
+}
+
+CcnxForwardingStrategy::CcnxForwardingStrategy ()
+{
+}
+
+CcnxForwardingStrategy::~CcnxForwardingStrategy ()
+{
+}
+
+void
+CcnxForwardingStrategy::NotifyNewAggregate ()
+{
+  if (m_pit == 0)
+    {
+      m_pit = GetObject<CcnxPit> ();
+    }
+  if (m_fib == 0)
+    {
+      m_fib = GetObject<CcnxFib> ();
+    }
+  if (m_contentStore == 0)
+    {
+      m_contentStore = GetObject<CcnxContentStore> ();
+    }
+
+  Object::NotifyNewAggregate ();
+}
+
+void
+CcnxForwardingStrategy::DoDispose ()
+{
+  m_pit = 0;
+  m_contentStore = 0;
+  m_fib = 0;
+
+  Object::DoDispose ();
+}
+
+void
+CcnxForwardingStrategy::OnInterest (const Ptr<CcnxFace> &incomingFace,
+                                    Ptr<CcnxInterestHeader> &header,
+                                    const Ptr<const Packet> &packet)
+{
+  m_inInterests (header, incomingFace);
+
+  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+  if (pitEntry == 0)
+    {
+      pitEntry = m_pit->Create (header);
+    }
+
+  if (pitEntry == 0)
+    {
+      // if it is still not created, then give up processing
+      m_dropInterests (header, incomingFace);
+      return;
+    }
+  
+  bool isNew = pitEntry->GetIncoming ().size () == 0 && pitEntry->GetOutgoing ().size () == 0;
+  bool isDuplicated = true;
+  if (!pitEntry->IsNonceSeen (header->GetNonce ()))
+    {
+      pitEntry->AddSeenNonce (header->GetNonce ());
+      isDuplicated = false;
+    }
+
+  NS_LOG_FUNCTION (header->GetName () << header->GetNonce () << boost::cref (*incomingFace) << isDuplicated);
+
+  /////////////////////////////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////////////////////////////
+  //                                                                                     //
+  // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
+  //                                                                                     //
+  /////////////////////////////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////////////////////////////
+  
+  // Data is not in cache
+  CcnxPitEntry::in_iterator inFace   = pitEntry->GetIncoming ().find (incomingFace);
+  CcnxPitEntry::out_iterator outFace = pitEntry->GetOutgoing ().find (incomingFace);
+
+  bool isRetransmitted = false;
+  
+  if (inFace != pitEntry->GetIncoming ().end ())
+    {
+      // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
+
+      isRetransmitted = true;
+      // this is almost definitely a retransmission. But should we trust the user on that?
+    }
+  else
+    {
+      inFace = pitEntry->AddIncoming (incomingFace);
+    }
+  //////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////
+  //////////////////////////////////////////////////////////////////////////////////
+  
+  if (isDuplicated) 
+    {
+      NS_LOG_DEBUG ("Received duplicatie interest on " << *incomingFace);
+      m_dropInterests (header, incomingFace);
+
+      /**
+       * This condition will handle "routing" loops and also recently satisfied interests.
+       * Every time interest is satisfied, PIT entry (with empty incoming and outgoing faces)
+       * is kept for another small chunk of time.
+       */
+
+      if (m_nacksEnabled)
+        {
+          NS_LOG_DEBUG ("Sending NACK_LOOP");
+          header->SetNack (CcnxInterestHeader::NACK_LOOP);
+          Ptr<Packet> nack = Create<Packet> ();
+          nack->AddHeader (*header);
+
+          incomingFace->Send (nack);
+          m_outNacks (header, incomingFace);
+        }
+      
+      return;
+    }
+
+  Ptr<Packet> contentObject;
+  Ptr<const CcnxContentObjectHeader> contentObjectHeader; // used for tracing
+  Ptr<const Packet> payload; // used for tracing
+  boost::tie (contentObject, contentObjectHeader, payload) = m_contentStore->Lookup (header);
+  if (contentObject != 0)
+    {
+      NS_ASSERT (contentObjectHeader != 0);      
+      NS_LOG_LOGIC("Found in cache");
+
+      OnDataDelayed (contentObjectHeader, payload, contentObject);
+      return;
+    }
+
+  // update PIT entry lifetime
+  pitEntry->UpdateLifetime (header->GetInterestLifetime ());
+  
+  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
+      // Probably, there is no point in waiting data from that face... Not sure yet
+
+      // If we're expecting data from the interface we got the interest from ("producer" asks us for "his own" data)
+      // Mark interface YELLOW, but keep a small hope that data will come eventually.
+
+      // ?? not sure if we need to do that ?? ...
+      
+      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));
+    }
+  else
+    if (!isNew && !isRetransmitted)
+      {
+        // Suppress this interest if we're still expecting data from some other face
+        NS_LOG_DEBUG ("Suppress interests");
+        m_dropInterests (header, incomingFace);
+        return;
+      }
+  
+  /////////////////////////////////////////////////////////////////////
+  // Propagate
+  /////////////////////////////////////////////////////////////////////
+  
+  bool propagated = PropagateInterest (pitEntry, incomingFace, header, packet);
+
+  if (!propagated && isRetransmitted) //give another chance if retransmitted
+    {
+      // increase max number of allowed retransmissions
+      pitEntry->IncreaseAllowedRetxCount ();
+
+      // try again
+      propagated = PropagateInterest (pitEntry, incomingFace, header, packet);
+    }
+  
+  // ForwardingStrategy will try its best to forward packet to at least one interface.
+  // If no interests was propagated, then there is not other option for forwarding or
+  // ForwardingStrategy failed to find it. 
+  if (!propagated)
+    {
+      NS_LOG_DEBUG ("Not propagated");
+      m_dropInterests (header, incomingFace);
+      GiveUpInterest (pitEntry, header);
+    }
+}
+
+void
+CcnxForwardingStrategy::OnData (const Ptr<CcnxFace> &incomingFace,
+                                Ptr<CcnxContentObjectHeader> &header,
+                                Ptr<Packet> &payload,
+                                const Ptr<const Packet> &packet)
+{
+  NS_LOG_FUNCTION (incomingFace << header->GetName () << payload << packet);
+  m_inData (header, payload, incomingFace);
+  
+  // 1. Lookup PIT entry
+  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+  if (pitEntry != 0)
+    {
+      // Note that with MultiIndex we need to modify entries indirectly
+
+      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->GetOutgoing ().end ())
+        {
+          pitEntry->GetFibEntry ()->UpdateFaceRtt (incomingFace, Simulator::Now () - out->m_sendTime);
+          // StaticCast<CcnxFibImpl> (m_fib)->modify (pitEntry->GetFibEntry (),
+          //                                          ll::bind (&CcnxFibEntry::UpdateFaceRtt,
+          //                                                    ll::_1,
+          //                                                    incomingFace,
+          //                                                    Simulator::Now () - out->m_sendTime));
+        }
+      else
+        {
+          // Unsolicited data, but we're interested in it... should we get it?
+          // Potential hole for attacks
+
+          if (m_cacheUnsolicitedData)
+            {
+              // Optimistically add or update entry in the content store
+              m_contentStore->Add (header, payload);
+            }
+          else
+            {
+              NS_LOG_ERROR ("PIT entry for "<< header->GetName ()<<" is valid, "
+                            "but outgoing entry for interface "<< boost::cref(*incomingFace) <<" doesn't exist\n");
+            }
+          // ignore unsolicited data
+          return;
+        }
+
+      // Update metric status for the incoming interface in the corresponding FIB entry
+      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));
+  
+      // Add or update entry in the content store
+      m_contentStore->Add (header, payload);
+
+      pitEntry->RemoveIncoming (incomingFace);
+
+      if (pitEntry->GetIncoming ().size () == 0)
+        {
+          // Set pruning timout on PIT entry (instead of deleting the record)
+          m_pit->MarkErased (pitEntry);
+        }
+      else
+        {
+          OnDataDelayed (header, payload, packet);
+        }
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Pit entry not found");
+      if (m_cacheUnsolicitedData)
+        {
+          // Optimistically add or update entry in the content store
+          m_contentStore->Add (header, payload);
+        }
+      else
+        {
+          // Drop data packet if PIT entry is not found
+          // (unsolicited data packets should not "poison" content store)
+      
+          //drop dulicated or not requested data packet
+          m_dropData (header, payload, incomingFace);
+        }
+      return; // do not process unsoliced data packets
+    }
+}
+
+
+bool
+CcnxForwardingStrategy::PropagateInterestViaGreen (Ptr<CcnxPitEntry> pitEntry, 
+                                                   const Ptr<CcnxFace> &incomingFace,
+                                                   Ptr<CcnxInterestHeader> &header,
+                                                   const Ptr<const Packet> &packet)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG (m_pit != 0, "PIT should be aggregated with forwarding strategy");
+
+  int propagatedCount = 0;
+  
+  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->GetIncoming ().find (metricFace.m_face) != pitEntry->GetIncoming ().end ()) 
+        continue; // don't forward to face that we received interest from
+
+      CcnxPitEntryOutgoingFaceContainer::type::iterator outgoing =
+        pitEntry->GetOutgoing ().find (metricFace.m_face);
+      
+      if (outgoing != pitEntry->GetOutgoing ().end () &&
+          outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
+        {
+          NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry->GetMaxRetxCount ());
+          continue;
+        }
+      
+      bool faceAvailable = metricFace.m_face->IsBelowLimit ();
+      if (!faceAvailable) // huh...
+        {
+          // let's try different green face
+          continue;
+        }
+
+      pitEntry->AddOutgoing (metricFace.m_face);
+
+      Ptr<Packet> packetToSend = packet->Copy ();
+
+      //transmission
+      metricFace.m_face->Send (packetToSend);
+      m_outInterests (header, metricFace.m_face);
+      
+      propagatedCount++;
+      break; // propagate only one interest
+    }
+
+  return propagatedCount > 0;
+}
+
+void
+CcnxForwardingStrategy::OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+                                       Ptr<const Packet> payload,
+                                       const Ptr<const Packet> &packet)
+{
+  // 1. Lookup PIT entry
+  Ptr<CcnxPitEntry> pitEntry = m_pit->Lookup (*header);
+  if (pitEntry != 0)
+    {
+      //satisfy all pending incoming Interests
+      BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry->GetIncoming ())
+        {
+          incoming.m_face->Send (packet->Copy ());
+          m_outData (header, payload, false, incoming.m_face);
+          NS_LOG_DEBUG ("Satisfy " << *incoming.m_face);
+          
+          // successfull forwarded data trace
+        }
+
+      if (pitEntry->GetIncoming ().size () > 0)
+        {
+          // All incoming interests are satisfied. Remove them
+          pitEntry->ClearIncoming ();
+
+          // Remove all outgoing faces
+          pitEntry->ClearOutgoing ();
+          
+          // Set pruning timout on PIT entry (instead of deleting the record)
+          m_pit->MarkErased (pitEntry);
+        }
+    }
+  else
+    {
+      NS_LOG_DEBUG ("Pit entry not found (was satisfied and removed before)");
+      return; // do not process unsoliced data packets
+    }
+}
+
+void
+CcnxForwardingStrategy::GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
+                                        Ptr<CcnxInterestHeader> header)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_nacksEnabled)
+    {
+      Ptr<Packet> packet = Create<Packet> ();
+      header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
+      packet->AddHeader (*header);
+
+      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 ());
+
+          m_outNacks (header, incoming.m_face);
+        }
+  
+      // All incoming interests cannot be satisfied. Remove them
+      pitEntry->ClearIncoming ();
+
+      // Remove also outgoing
+      pitEntry->ClearOutgoing ();
+  
+      // Set pruning timout on PIT entry (instead of deleting the record)
+      m_pit->MarkErased (pitEntry);
+    }
+}
+
+
+} //namespace ns3
diff --git a/model/forwarding-strategy/ccnx-forwarding-strategy.h b/model/forwarding-strategy/ccnx-forwarding-strategy.h
new file mode 100644
index 0000000..20d92a4
--- /dev/null
+++ b/model/forwarding-strategy/ccnx-forwarding-strategy.h
@@ -0,0 +1,184 @@
+/* -*- 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>
+ *          Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+#ifndef CCNX_FORWARDING_STRATEGY_H
+#define CCNX_FORWARDING_STRATEGY_H
+
+#include "ns3/packet.h"
+#include "ns3/callback.h"
+#include "ns3/object.h"
+#include "ns3/traced-callback.h"
+
+namespace ns3 {
+
+class CcnxFace;
+class CcnxInterestHeader;
+class CcnxContentObjectHeader;
+class CcnxPit;
+class CcnxPitEntry;
+class CcnxFibFaceMetric;
+class CcnxFib;
+class CcnxContentStore;
+
+/**
+ * \ingroup ccnx
+ * \brief Abstract base class for CCNx forwarding strategies
+ */
+class CcnxForwardingStrategy : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+
+  /**
+   * @brief Default constructor
+   */
+  CcnxForwardingStrategy ();
+  virtual ~CcnxForwardingStrategy ();
+
+  /**
+   * \brief Actual processing of incoming CCNx interests. Note, interests do not have payload
+   * 
+   * Processing Interest packets
+   * @param face    incoming face
+   * @param header  deserialized Interest header
+   * @param packet  original packet
+   */
+  virtual void
+  OnInterest (const Ptr<CcnxFace> &face,
+              Ptr<CcnxInterestHeader> &header,
+              const Ptr<const Packet> &p);
+
+  /**
+   * \brief Actual processing of incoming CCNx content objects
+   * 
+   * Processing ContentObject packets
+   * @param face    incoming face
+   * @param header  deserialized ContentObject header
+   * @param payload data packet payload
+   * @param packet  original packet
+   */
+  virtual void
+  OnData (const Ptr<CcnxFace> &face,
+          Ptr<CcnxContentObjectHeader> &header,
+          Ptr<Packet> &payload,
+          const Ptr<const Packet> &packet);
+    
+// protected:
+  /**
+   * @brief Base method to propagate the interest according to the forwarding strategy
+   *
+   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
+   * @param incomingFace  Incoming face
+   * @param header        CcnxInterestHeader
+   * @param packet        Original Interest packet
+   * @param sendCallback  Send callback
+   *
+   * @return true if interest was successfully propagated, false if all options have failed
+   */
+  virtual bool
+  PropagateInterest (Ptr<CcnxPitEntry> pitEntry, 
+                     const Ptr<CcnxFace> &incomingFace,
+                     Ptr<CcnxInterestHeader> &header,
+                     const Ptr<const Packet> &packet) = 0;
+
+protected:
+  /**
+   * @brief Propagate interest via a green interface. Fail, if no green interfaces available
+   *
+   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
+   * @param incomingFace  Incoming face
+   * @param header        CcnxInterestHeader
+   * @param packet        Original Interest packet
+   * @param sendCallback  Send callback
+   * @return true if interest was successfully propagated, false if all options have failed
+   *
+   * \see PropagateInterest
+   */
+  bool
+  PropagateInterestViaGreen (Ptr<CcnxPitEntry> pitEntry, 
+                             const Ptr<CcnxFace> &incomingFace,
+                             Ptr<CcnxInterestHeader> &header,
+                             const Ptr<const Packet> &packet);
+
+  virtual void
+  GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
+                  Ptr<CcnxInterestHeader> header);
+
+  virtual void
+  OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+                 Ptr<const Packet> payload,
+                 const Ptr<const Packet> &packet);
+  
+protected:
+  // inherited from Object class                                                                                                                                                        
+  virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
+  virtual void DoDispose (); ///< @brief Do cleanup
+  
+protected:  
+  Ptr<CcnxPit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
+  Ptr<CcnxFib> m_fib; ///< \brief FIB  
+  Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
+
+  bool m_nacksEnabled;
+  bool m_cacheUnsolicitedData;
+
+  // transmittedInterestTrace is inside ForwardingStrategy
+  
+  
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_outInterests; ///< @brief Transmitted interests trace
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_inInterests; ///< @brief trace of incoming Interests
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_dropInterests; ///< @brief trace of dropped Interests
+  
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_outNacks; ///< @brief trace of outgoing NACKs
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_inNacks; ///< @brief trace of incoming NACKs
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_dropNacks; ///< @brief trace of dropped NACKs
+
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                 bool /*from cache*/,
+                 Ptr<const CcnxFace> > m_outData; ///< @brief trace of outgoing Data
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                 Ptr<const CcnxFace> > m_inData; ///< @brief trace of incoming Data
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                  Ptr<const CcnxFace> > m_dropData;  ///< @brief trace of dropped Data
+};
+
+} //namespace ns3
+
+#endif /* CCNX_FORWARDING_STRATEGY_H */
diff --git a/model/ccnx-pit-entry-impl.h b/model/pit/ccnx-pit-entry-impl.h
similarity index 100%
rename from model/ccnx-pit-entry-impl.h
rename to model/pit/ccnx-pit-entry-impl.h
diff --git a/model/ccnx-pit-entry-incoming-face.cc b/model/pit/ccnx-pit-entry-incoming-face.cc
similarity index 100%
rename from model/ccnx-pit-entry-incoming-face.cc
rename to model/pit/ccnx-pit-entry-incoming-face.cc
diff --git a/model/ccnx-pit-entry-incoming-face.h b/model/pit/ccnx-pit-entry-incoming-face.h
similarity index 98%
rename from model/ccnx-pit-entry-incoming-face.h
rename to model/pit/ccnx-pit-entry-incoming-face.h
index f88ad8a..7c5e17d 100644
--- a/model/ccnx-pit-entry-incoming-face.h
+++ b/model/pit/ccnx-pit-entry-incoming-face.h
@@ -24,7 +24,7 @@
 #include "ns3/nstime.h"
 #include "ns3/ptr.h"
 
-#include "ccnx-face.h"
+#include "ns3/ccnx-face.h"
 // #include <iostream>
 
 namespace ns3 {
diff --git a/model/ccnx-pit-entry-outgoing-face.cc b/model/pit/ccnx-pit-entry-outgoing-face.cc
similarity index 100%
rename from model/ccnx-pit-entry-outgoing-face.cc
rename to model/pit/ccnx-pit-entry-outgoing-face.cc
diff --git a/model/ccnx-pit-entry-outgoing-face.h b/model/pit/ccnx-pit-entry-outgoing-face.h
similarity index 98%
rename from model/ccnx-pit-entry-outgoing-face.h
rename to model/pit/ccnx-pit-entry-outgoing-face.h
index fbd13c5..b16b4fd 100644
--- a/model/ccnx-pit-entry-outgoing-face.h
+++ b/model/pit/ccnx-pit-entry-outgoing-face.h
@@ -24,7 +24,7 @@
 #include "ns3/nstime.h"
 #include "ns3/ptr.h"
 
-#include "ccnx-face.h"
+#include "ns3/ccnx-face.h"
 
 namespace ns3 {
 
diff --git a/model/ccnx-pit-entry.cc b/model/pit/ccnx-pit-entry.cc
similarity index 97%
rename from model/ccnx-pit-entry.cc
rename to model/pit/ccnx-pit-entry.cc
index 73f966c..081b155 100644
--- a/model/ccnx-pit-entry.cc
+++ b/model/pit/ccnx-pit-entry.cc
@@ -19,9 +19,10 @@
  */
 
 #include "ccnx-pit-entry.h"
-#include "ccnx-name-components.h"
-#include "ccnx-fib.h"
-#include "ccnx-interest-header.h"
+
+#include "ns3/ccnx-fib.h"
+#include "ns3/ccnx-name-components.h"
+#include "ns3/ccnx-interest-header.h"
 
 #include "ns3/simulator.h"
 #include "ns3/log.h"
diff --git a/model/ccnx-pit-entry.h b/model/pit/ccnx-pit-entry.h
similarity index 99%
rename from model/ccnx-pit-entry.h
rename to model/pit/ccnx-pit-entry.h
index 1ccb6b4..37de28e 100644
--- a/model/ccnx-pit-entry.h
+++ b/model/pit/ccnx-pit-entry.h
@@ -24,9 +24,9 @@
 #include "ns3/ptr.h"
 #include "ns3/simple-ref-count.h"
 
+#include "ns3/ccnx-fib.h"
 #include "ccnx-pit-entry-incoming-face.h"
 #include "ccnx-pit-entry-outgoing-face.h"
-#include "ccnx-fib.h"
 
 #include <boost/multi_index_container.hpp>
 #include <boost/multi_index/tag.hpp>
diff --git a/model/ccnx-pit-impl.cc b/model/pit/ccnx-pit-impl.cc
similarity index 98%
rename from model/ccnx-pit-impl.cc
rename to model/pit/ccnx-pit-impl.cc
index f68f9dd..c1867f0 100644
--- a/model/ccnx-pit-impl.cc
+++ b/model/pit/ccnx-pit-impl.cc
@@ -19,12 +19,14 @@
  */
 
 #include "ccnx-pit-impl.h"
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
 #include "ns3/log.h"
 #include "ns3/string.h"
 #include "ns3/uinteger.h"
 #include "ns3/simulator.h"
-#include "ccnx-interest-header.h"
-#include "ccnx-content-object-header.h"
 
 #include <boost/lambda/bind.hpp>
 #include <boost/lambda/lambda.hpp>
diff --git a/model/ccnx-pit-impl.h b/model/pit/ccnx-pit-impl.h
similarity index 96%
rename from model/ccnx-pit-impl.h
rename to model/pit/ccnx-pit-impl.h
index 123ed85..692f78b 100644
--- a/model/ccnx-pit-impl.h
+++ b/model/pit/ccnx-pit-impl.h
@@ -22,9 +22,10 @@
 #define	_CCNX_PIT_IMPL_H_
 
 #include "ccnx-pit.h"
-#include "../utils/trie-with-policy.h"
-#include "../utils/empty-policy.h"
-#include "../utils/persistent-policy.h"
+
+#include "../../utils/trie-with-policy.h"
+#include "../../utils/empty-policy.h"
+#include "../../utils/persistent-policy.h"
 
 #include "ccnx-pit-entry-impl.h"
 
diff --git a/model/ccnx-pit.cc b/model/pit/ccnx-pit.cc
similarity index 96%
rename from model/ccnx-pit.cc
rename to model/pit/ccnx-pit.cc
index 00b892d..00e58c7 100644
--- a/model/ccnx-pit.cc
+++ b/model/pit/ccnx-pit.cc
@@ -19,12 +19,14 @@
  */
 
 #include "ccnx-pit.h"
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
 #include "ns3/log.h"
 #include "ns3/string.h"
 #include "ns3/uinteger.h"
 #include "ns3/simulator.h"
-#include "ccnx-interest-header.h"
-#include "ccnx-content-object-header.h"
 
 #include <boost/lambda/bind.hpp>
 #include <boost/lambda/lambda.hpp>
diff --git a/model/ccnx-pit.h b/model/pit/ccnx-pit.h
similarity index 100%
rename from model/ccnx-pit.h
rename to model/pit/ccnx-pit.h
diff --git a/wscript b/wscript
index 9aa87aa..a0238ba 100644
--- a/wscript
+++ b/wscript
@@ -56,13 +56,11 @@
         bld.env['MODULES_NOT_BUILT'].append('ndnSIM')
         return
    
-    module.source = bld.path.ant_glob(['model/*.cc', 'apps/*.cc', 
+    module.source = bld.path.ant_glob(['model/**/*.cc',
+                                       'apps/*.cc',
                                        'utils/*.cc',
-                                       'helper/*.cc',
-                                       'helper/tracers/*.cc',
-                                       'helper/ccnb-parser/*.cc',
-                                       'helper/ccnb-parser/visitors/*.cc',
-                                       'helper/ccnb-parser/syntax-tree/*.cc'])
+                                       'helper/**/*.cc',
+                                       ])
 
     headers.source = [
         "helper/ccnx-stack-helper.h",
@@ -74,21 +72,21 @@
         "apps/ccnx-app.h",
 
         "model/ccnx.h",
-        "model/ccnx-pit.h",
-        "model/ccnx-pit-entry.h",
-        "model/ccnx-pit-entry-incoming-face.h",
-        "model/ccnx-pit-entry-outgoing-face.h",
-        "model/ccnx-content-store.h",
-        "model/ccnx-fib.h",
-        "model/ccnx-fib-entry.h",
-        "model/ccnx-forwarding-strategy.h",
+        "model/pit/ccnx-pit.h",
+        "model/pit/ccnx-pit-entry.h",
+        "model/pit/ccnx-pit-entry-incoming-face.h",
+        "model/pit/ccnx-pit-entry-outgoing-face.h",
+        "model/content-store/ccnx-content-store.h",
+        "model/fib/ccnx-fib.h",
+        "model/fib/ccnx-fib-entry.h",
+        "model/forwarding-strategy/ccnx-forwarding-strategy.h",
         "model/ccnx-face.h",
         "model/ccnx-app-face.h",
         "model/ccnx-net-device-face.h",
         "model/ccnx-interest-header.h",
         "model/ccnx-content-object-header.h",
         "model/ccnx-name-components.h",
-        "model/ccnx-name-components-hash-helper.h",
+        # "model/ccnx-name-components-hash-helper.h",
 
         "utils/batches.h",
         # "utils/weights-path-stretch-tag.h",
