diff --git a/model/ccnx-fib.cc b/model/ccnx-fib.cc
index bfcb961..1c86b28 100644
--- a/model/ccnx-fib.cc
+++ b/model/ccnx-fib.cc
@@ -38,8 +38,11 @@
 #include <boost/lambda/bind.hpp>
 namespace ll = boost::lambda;
 
+NS_LOG_COMPONENT_DEFINE ("CcnxFib");
+
 namespace ns3 {
 
+NS_OBJECT_ENSURE_REGISTERED (CcnxFib);
 
 //////////////////////////////////////////////////////////////////////
 // Helpers
@@ -55,7 +58,6 @@
 }
 //////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////
-NS_LOG_COMPONENT_DEFINE ("CcnxFib");
     
 using namespace __ccnx_private;
 
diff --git a/model/ccnx-forwarding-strategy.cc b/model/ccnx-forwarding-strategy.cc
index a856577..93c3847 100644
--- a/model/ccnx-forwarding-strategy.cc
+++ b/model/ccnx-forwarding-strategy.cc
@@ -67,9 +67,18 @@
 }
 
 void
-CcnxForwardingStrategy::SetPit (Ptr<CcnxPit> pit)
+CcnxForwardingStrategy::NotifyNewAggregate ()
 {
-  m_pit = pit;
+  if (m_pit == 0)
+    {
+      m_pit = GetObject<CcnxPit> ();
+    }
+}
+
+void
+CcnxForwardingStrategy::DoDispose ()
+{
+  // nothing to do...
 }
 
 bool
@@ -79,6 +88,7 @@
                                                    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;
   
diff --git a/model/ccnx-forwarding-strategy.h b/model/ccnx-forwarding-strategy.h
index 07e6cf2..99ed02c 100644
--- a/model/ccnx-forwarding-strategy.h
+++ b/model/ccnx-forwarding-strategy.h
@@ -66,14 +66,6 @@
                      Ptr<CcnxInterestHeader> &header,
                      const Ptr<const Packet> &packet) = 0;
     
-  /**
-   * @brief Set link to PIT for the forwarding strategy
-   *
-   * @param pit pointer to PIT
-   */
-  void
-  SetPit (Ptr<CcnxPit> pit);
-  
 protected:
   /**
    * @brief Propagate interest via a green interface. Fail, if no green interfaces available
@@ -95,6 +87,11 @@
 
   /// @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
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 013a2ee..aa5be00 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -71,11 +71,6 @@
                    MakeObjectVectorAccessor (&CcnxL3Protocol::m_faces),
                    MakeObjectVectorChecker<CcnxFace> ())
 
-    .AddAttribute ("ForwardingStrategy", "Forwarding strategy used by CCNx stack",
-                   PointerValue (),
-                   MakePointerAccessor (&CcnxL3Protocol::SetForwardingStrategy, &CcnxL3Protocol::GetForwardingStrategy),
-                   MakePointerChecker<CcnxForwardingStrategy> ())
-    
     .AddAttribute ("EnableNACKs", "Enabling support of NACKs",
                    BooleanValue (false),
                    MakeBooleanAccessor (&CcnxL3Protocol::m_nacksEnabled),
@@ -84,10 +79,6 @@
                    BooleanValue (false),
                    MakeBooleanAccessor (&CcnxL3Protocol::m_cacheUnsolicitedData),
                    MakeBooleanChecker ())
-    .AddAttribute ("RandomDataDelaying", "Delaying data processing",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&CcnxL3Protocol::m_delayingDataProcessing),
-                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -96,8 +87,6 @@
 : m_faceCounter (0)
 {
   NS_LOG_FUNCTION (this);
-  
-  m_pit = CreateObject<CcnxPit> ();
 }
 
 CcnxL3Protocol::~CcnxL3Protocol ()
@@ -105,16 +94,6 @@
   NS_LOG_FUNCTION (this);
 }
 
-void
-CcnxL3Protocol::SetNode (Ptr<Node> node)
-{
-  m_node = node;
-  m_fib = m_node->GetObject<CcnxFib> ();
-  NS_ASSERT_MSG (m_fib != 0, "FIB should be created and aggregated to a node before calling Ccnx::SetNode");
-
-  m_pit->SetFib (m_fib);
-}
-
 /*
  * This method is called by AddAgregate and completes the aggregation
  * by setting the node in the ccnx stack
@@ -122,19 +101,31 @@
 void
 CcnxL3Protocol::NotifyNewAggregate ()
 {
+  // not really efficient, but this will work only once
   if (m_node == 0)
     {
-      Ptr<Node> node = this->GetObject<Node>();
-      // verify that it's a valid node and that
-      // the node has not been set before
-      if (node != 0)
+      m_node = GetObject<Node> ();
+      if (m_node != 0)
         {
-          this->SetNode (node);
+          NS_ASSERT_MSG (m_pit != 0 && m_fib != 0 && m_contentStore != 0 && m_forwardingStrategy != 0,
+                         "PIT, FIB, and ContentStore should be aggregated before CcnxL3Protocol");
         }
     }
+  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 = this->GetObject<CcnxContentStore> ();
+      m_contentStore = GetObject<CcnxContentStore> ();
     }
 
   Object::NotifyNewAggregate ();
@@ -158,31 +149,9 @@
   m_contentStore = 0;
   m_fib = 0;
 
-  // m_forwardingStrategy = 0;
   Object::DoDispose ();
 }
 
-void
-CcnxL3Protocol::SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy)
-{
-  NS_LOG_FUNCTION (this);
-  m_forwardingStrategy = forwardingStrategy;
-  m_forwardingStrategy->SetPit (m_pit);
-}
-
-Ptr<CcnxForwardingStrategy>
-CcnxL3Protocol::GetForwardingStrategy (void) const
-{
-  return m_forwardingStrategy;
-}
-
-Ptr<CcnxPit>
-CcnxL3Protocol::GetPit () const
-{
-  return m_pit;
-}
-
-
 uint32_t 
 CcnxL3Protocol::AddFace (const Ptr<CcnxFace> &face)
 {
@@ -388,8 +357,6 @@
       return;
     }
   
-  NS_ASSERT_MSG (m_forwardingStrategy != 0, "Need a forwarding protocol object to process packets");
-
   Ptr<Packet> nonNackInterest = Create<Packet> ();
   header->SetNack (CcnxInterestHeader::NORMAL_INTEREST);
   nonNackInterest->AddHeader (*header);
@@ -531,8 +498,6 @@
   // Propagate
   /////////////////////////////////////////////////////////////////////
   
-  NS_ASSERT_MSG (m_forwardingStrategy != 0, "Need a forwarding protocol object to process packets");
-  
   bool propagated = m_forwardingStrategy->
     PropagateInterest (pitEntry, incomingFace, header, packet);
 
@@ -563,12 +528,6 @@
                                Ptr<const Packet> payload,
                                const Ptr<const Packet> &packet)
 {
-  if (m_delayingDataProcessing)
-    {
-      NS_LOG_DEBUG ("Delayed processing " << header->GetName ());
-      // NS_LOG_DEBUG (*m_pit);
-    }
-  
   // 1. Lookup PIT entry
   try
     {
@@ -677,17 +636,7 @@
         }
       else
         {
-          if (!m_delayingDataProcessing)
-            {
-              OnDataDelayed (header, payload, packet);
-            }
-          else
-            {
-              NS_LOG_DEBUG ("Delaying Data forwarding " << header->GetName ());
-              UniformVariable delay (0.0001, 0.002);
-              Simulator::Schedule (Seconds (delay.GetValue ()),
-                                   &CcnxL3Protocol::OnDataDelayed, this, header, payload, packet);
-            }
+          OnDataDelayed (header, payload, packet);
         }
     }
   catch (CcnxPitEntryNotFound)
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 157703c..1d5a3af 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -83,25 +83,8 @@
   CcnxL3Protocol();
   virtual ~CcnxL3Protocol ();
 
-  /**
-   * \brief Assigns node to the CCNx stack
-   *
-   * \param node Simulation node
-   */
-  void SetNode (Ptr<Node> node);
-
   ////////////////////////////////////////////////////////////////////
   // functions defined in base class Ccnx
-  
-  void SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy);
-  Ptr<CcnxForwardingStrategy> GetForwardingStrategy () const;
-
-  // virtual void SendInterest (const Ptr<CcnxFace> &face,
-  //                            const Ptr<const CcnxInterestHeader> &header,
-  //                            const Ptr<Packet> &packet);
-  // virtual void SendContentObject (const Ptr<CcnxFace> &face,
-  //                                 const Ptr<const CcnxContentObjectHeader> &header,
-  //                                 const Ptr<Packet> &packet);
 
   virtual uint32_t
   AddFace (const Ptr<CcnxFace> &face);
@@ -118,9 +101,6 @@
   virtual Ptr<CcnxFace>
   GetFaceByNetDevice (Ptr<NetDevice> netDevice) const;
   
-  virtual Ptr<CcnxPit>
-  GetPit () const;
-  
   // void ScheduleLeakage();
 private:
   void
@@ -206,20 +186,15 @@
   typedef std::vector<Ptr<CcnxFace> > CcnxFaceList;
   CcnxFaceList m_faces; ///< \brief list of faces that belongs to ccnx stack on this node
 
+  // 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<CcnxRit> m_rit; ///< \brief RIT (recently interest table)
   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_delayingDataProcessing;
-  
-  // Time    m_bucketLeakInterval;
-  // EventId m_bucketLeakEvent;
 };
   
 } // Namespace ns3
diff --git a/model/ccnx-pit.cc b/model/ccnx-pit.cc
index 6e63550..4186af4 100644
--- a/model/ccnx-pit.cc
+++ b/model/ccnx-pit.cc
@@ -21,6 +21,7 @@
 #include "ccnx-pit.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"
@@ -63,6 +64,12 @@
                    StringValue("4s"),
                    MakeTimeAccessor (&CcnxPit::m_PitEntryDefaultLifetime),
                    MakeTimeChecker ())
+
+    .AddAttribute ("MaxSize",
+                   "Set maximum number of entries in PIT. If 0, limit is not enforced",
+                   StringValue ("0"),
+                   MakeUintegerAccessor (&CcnxPit::m_maxSize),
+                   MakeUintegerChecker<uint32_t> ())
     ;
 
   return tid;
@@ -74,12 +81,15 @@
 
 CcnxPit::~CcnxPit ()
 {
-  DoDispose ();
 }
 
 void 
 CcnxPit::NotifyNewAggregate ()
 {
+  if (m_fib == 0)
+    {
+      m_fib = GetObject<CcnxFib> ();
+    }
 }
 
 void 
@@ -134,12 +144,6 @@
                                         &CcnxPit::CleanExpired, this); 
 }
 
-void
-CcnxPit::SetFib (Ptr<CcnxFib> fib)
-{
-  m_fib = fib;
-}
-
 CcnxPitEntryContainer::type::iterator
 CcnxPit::Lookup (const CcnxContentObjectHeader &header) const
 {
@@ -177,6 +181,13 @@
 
   if (entry == end ())
     {
+      if (m_maxSize > 0 &&
+          size () >= m_maxSize)
+        {
+          // remove old record
+          get<i_timestamp> ().erase (get<i_timestamp> ().begin ());
+        }
+      
       CcnxFibEntryContainer::type::iterator fibEntry = m_fib->LongestPrefixMatch (header);
       NS_ASSERT_MSG (fibEntry != m_fib->m_fib.end (),
                      "There should be at least default route set" << " Prefix = "<<header.GetName() << "NodeID == " << m_fib->GetObject<Node>()->GetId() << "\n" << *m_fib);
diff --git a/model/ccnx-pit.h b/model/ccnx-pit.h
index 84b1685..826f49f 100644
--- a/model/ccnx-pit.h
+++ b/model/ccnx-pit.h
@@ -150,11 +150,6 @@
     return m_PitEntryPruningTimout;
   }
   
-  /**
-   * \brief Set FIB table
-   */
-  void SetFib (Ptr<CcnxFib> fib);
-
 protected:
   // inherited from Object class                                                                                                                                                        
   virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
@@ -190,6 +185,8 @@
   Time    m_PitEntryPruningTimout;
   Time    m_PitEntryDefaultLifetime;
 
+  uint32_t m_maxSize;
+
   Ptr<CcnxFib> m_fib; ///< \brief Link to FIB table
 };
 
diff --git a/model/ccnx.h b/model/ccnx.h
index 4dc3cea..41e950a 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -90,29 +90,7 @@
    */
   static TypeId GetTypeId ();
   virtual ~Ccnx ();
-
-  /**
-   * \brief Register a new forwarding strategy to be used by this Ccnx
-   * stack
-   *
-   * This call will replace any forwarding strategy that has been
-   * previously registered.
-   * 
-   * \param forwardingStrategy smart pointer to CcnxForwardingStrategy
-   * object
-   */
-  virtual void
-  SetForwardingStrategy (Ptr<CcnxForwardingStrategy> forwardingStrategy) = 0;
-
-  /**
-   * \brief Get the forwarding strategy being used by this Ccnx stack
-   * 
-   * \returns smart pointer to CcnxForwardingStrategy object, or null
-   * pointer if none
-   */
-  virtual Ptr<CcnxForwardingStrategy>
-  GetForwardingStrategy (void) const = 0;
-
+  
   /**
    * \brief Add face to CCNx stack
    *
@@ -154,12 +132,6 @@
   GetFaceByNetDevice (Ptr<NetDevice> netDevice) const = 0;
 
   /**
-   * \brief Get PIT associated with Node 
-   */
-  virtual Ptr<CcnxPit>
-  GetPit() const = 0;
-
-  /**
    * \enum DropReason
    * \brief A reason why the packet has been dropped
    */
