Merge remote-tracking branch 'git.irl/master'
diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
index 30ad394..ae56040 100644
--- a/apps/ccnx-consumer.cc
+++ b/apps/ccnx-consumer.cc
@@ -27,6 +27,7 @@
 #include "ns3/string.h"
 #include "ns3/boolean.h"
 #include "ns3/uinteger.h"
+#include "ns3/double.h"
 
 #include "ns3/ccnx.h"
 #include "../model/ccnx-local-face.h"
@@ -54,15 +55,27 @@
     .SetParent<CcnxApp> ()
     .AddConstructor<CcnxConsumer> ()
     .AddAttribute ("StartSeq", "Initial sequence number",
-                   IntegerValue(0),
+                   IntegerValue (0),
                    MakeIntegerAccessor(&CcnxConsumer::m_seq),
                    MakeIntegerChecker<int32_t>())
-    
-    .AddAttribute ("OffTime", "Time interval between packets",
-                   StringValue ("100ms"),
-                   MakeTimeAccessor (&CcnxConsumer::m_offTime),
-                   MakeTimeChecker ())
-    .AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
+
+    .AddAttribute ("Size", "Amount of data in megabytes to request (relies on PayloadSize parameter)",
+                   DoubleValue (-1), // don't impose limit by default
+                   MakeDoubleAccessor (&CcnxConsumer::GetMaxSize, &CcnxConsumer::SetMaxSize),
+                   MakeDoubleChecker<double> ())
+
+    ///////
+    .AddAttribute ("PayloadSize", "Average size of content object size (to calculate interest generation rate)",
+                   UintegerValue (1040),
+                   MakeUintegerAccessor (&CcnxConsumer::GetPayloadSize, &CcnxConsumer::SetPayloadSize),
+                   MakeUintegerChecker<uint32_t>())
+    .AddAttribute ("MeanRate", "Mean data packet rate (relies on the PayloadSize parameter)",
+                   StringValue ("100Kbps"),
+                   MakeDataRateAccessor (&CcnxConsumer::GetDesiredRate, &CcnxConsumer::SetDesiredRate),
+                   MakeDataRateChecker ())
+    ///////
+
+    .AddAttribute ("Prefix","CcnxName of the Interest",
                    StringValue ("/"),
                    MakeCcnxNameComponentsAccessor (&CcnxConsumer::m_interestName),
                    MakeCcnxNameComponentsChecker ())
@@ -107,9 +120,13 @@
     
 CcnxConsumer::CcnxConsumer ()
   : m_rand (0, std::numeric_limits<uint32_t>::max ())
+  , m_desiredRate ("10Kbps")
+  , m_payloadSize (1040)
   , m_seq (0)
 {
   NS_LOG_FUNCTION_NOARGS ();
+
+  UpdateMean (); // not necessary (will be called by ns3 object system anyways), but doesn't hurt
 }
 
 void
@@ -150,11 +167,81 @@
       else
         break; // nothing else to do. All later packets need not be retransmitted
     }
+
+  if (m_retxSeqs.size () > 0)
+    {
+      ScheduleNextPacket ();
+    }
   
   m_retxEvent = Simulator::Schedule (m_retxTimer,
                                      &CcnxConsumer::CheckRetxTimeout, this); 
 }
 
+void
+CcnxConsumer::UpdateMean ()
+{
+  double mean = 8.0 * m_payloadSize / m_desiredRate.GetBitRate ();
+  m_randExp = ExponentialVariable (mean, 10000 * mean); // set upper limit to inter-arrival time
+}
+
+void
+CcnxConsumer::SetPayloadSize (uint32_t payload)
+{
+  m_payloadSize = payload;
+  UpdateMean ();
+}
+
+uint32_t
+CcnxConsumer::GetPayloadSize () const
+{
+  return m_payloadSize;
+}
+
+void
+CcnxConsumer::SetDesiredRate (DataRate rate)
+{
+  m_desiredRate = rate;
+  UpdateMean ();
+}
+
+DataRate
+CcnxConsumer::GetDesiredRate () const
+{
+  return m_desiredRate;
+}
+
+double
+CcnxConsumer::GetMaxSize () const
+{
+  if (m_seqMax == 0)
+    return -1.0;
+
+  return m_seqMax * m_payloadSize / 1024.0 / 1024.0;
+}
+
+void
+CcnxConsumer::SetMaxSize (double size)
+{
+  if (size < 0)
+    {
+      m_seqMax = 0;
+      return;
+    }
+
+  m_seqMax = floor(1.0 + size * 1024.0 * 1024.0 / m_payloadSize);
+  NS_LOG_DEBUG ("MaxSeqNo: " << m_seqMax);
+}
+
+
+void
+CcnxConsumer::ScheduleNextPacket ()
+{
+  if (!m_sendEvent.IsRunning ())
+    m_sendEvent = Simulator::Schedule (
+                                       Seconds(m_randExp.GetValue ()),
+                                       &CcnxConsumer::SendPacket, this);
+}
+
 // Application Methods
 void 
 CcnxConsumer::StartApplication () // Called at time specified by Start
@@ -163,9 +250,8 @@
 
   // do base stuff
   CcnxApp::StartApplication ();
-  
-  // schedule periodic packet generation
-  m_sendEvent = Simulator::Schedule (Seconds(0.0), &CcnxConsumer::SendPacket, this);
+
+  ScheduleNextPacket ();
 }
     
 void 
@@ -183,6 +269,8 @@
 void
 CcnxConsumer::SendPacket ()
 {
+  if (!m_active) return;
+
   NS_LOG_FUNCTION_NOARGS ();
 
   boost::mutex::scoped_lock (m_seqTimeoutsGuard);
@@ -192,10 +280,22 @@
   if (m_retxSeqs.size () != 0)
     {
       seq = *m_retxSeqs.begin ();
+      NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
       m_retxSeqs.erase (m_retxSeqs.begin ());
+      NS_LOG_INFO ("After: " << m_retxSeqs.size ());
     }
   else
-    seq = m_seq++;
+    {
+      if (m_seqMax > 0)
+        {
+          if (m_seq >= m_seqMax)
+            {
+              return; // we are totally done
+            }
+        }
+      
+      seq = m_seq++;
+    }
   
   //
   Ptr<CcnxNameComponents> nameWithSequence = Create<CcnxNameComponents> (m_interestName);
@@ -231,15 +331,22 @@
     m_seqTimeouts.modify (res.first,
                           ll::bind(&SeqTimeout::time, ll::_1) = Simulator::Now ());
   
-  m_sendEvent = Simulator::Schedule (m_offTime, &CcnxConsumer::SendPacket, this);
-
   m_transmittedInterests (&interestHeader, this, m_face);
+
+  ScheduleNextPacket ();
 }
 
+///////////////////////////////////////////////////
+//          Process incoming packets             //
+///////////////////////////////////////////////////
+
+
 void
 CcnxConsumer::OnContentObject (const Ptr<const CcnxContentObjectHeader> &contentObject,
                                const Ptr<const Packet> &payload)
 {
+  if (!m_active) return;
+
   CcnxApp::OnContentObject (contentObject, payload); // tracing inside
   
   NS_LOG_FUNCTION (this << contentObject << payload);
@@ -251,20 +358,28 @@
 
   boost::mutex::scoped_lock (m_seqTimeoutsGuard);
   
-  SeqTimeoutsContainer::iterator entry = m_seqTimeouts.find (seq);
+  // SeqTimeoutsContainer::iterator entry = m_seqTimeouts.find (seq);
 
-  NS_ASSERT_MSG (entry != m_seqTimeouts.end (),
-                 "Comment out this assert, if it causes problems");
+  //  NS_ASSERT_MSG (entry != m_seqTimeouts.end (),
+  //             "Comment out this assert, if it causes problems");
 
-  if (entry != m_seqTimeouts.end ())
-    m_seqTimeouts.erase (entry);
+  // if (entry != m_seqTimeouts.end ())
+  //   m_seqTimeouts.erase (entry);
+
+  m_seqTimeouts.erase (seq);
+  m_retxSeqs.erase (seq);
 }
 
 void
 CcnxConsumer::OnNack (const Ptr<const CcnxInterestHeader> &interest)
 {
+  if (!m_active) return;
+  
   CcnxApp::OnNack (interest); // tracing inside
   
+  NS_LOG_DEBUG ("Nack type: " << interest->GetNack ());
+  boost::mutex::scoped_lock (m_seqTimeoutsGuard);
+
   NS_LOG_FUNCTION (this << interest);
 
   // NS_LOG_INFO ("Received NACK: " << boost::cref(*interest));
@@ -272,7 +387,11 @@
   NS_LOG_INFO ("< NACK for " << seq);
 
   // put in the queue of interests to be retransmitted
+  NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
   m_retxSeqs.insert (seq);
+  NS_LOG_INFO ("After: " << m_retxSeqs.size ());
+
+  ScheduleNextPacket ();
 }
 
 } // namespace ns3
diff --git a/apps/ccnx-consumer.h b/apps/ccnx-consumer.h
index fc4e363..9b28a2c 100644
--- a/apps/ccnx-consumer.h
+++ b/apps/ccnx-consumer.h
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
 #ifndef CCNX_CONSUMER_H
@@ -25,6 +26,7 @@
 #include "ns3/random-variable.h"
 #include "ns3/ccnx-name-components.h"
 #include "ns3/nstime.h"
+#include "ns3/data-rate.h"
 
 #include <set>
 
@@ -77,6 +79,24 @@
    * \brief Constructs the Interest packet and sends it using a callback to the underlying CCNx protocol
    */
   void
+  ScheduleNextPacket ();
+
+  void
+  UpdateMean ();
+
+  void
+  SetPayloadSize (uint32_t payload);
+
+  uint32_t
+  GetPayloadSize () const;
+
+  void
+  SetDesiredRate (DataRate rate);
+
+  DataRate
+  GetDesiredRate () const;
+  
+  void
   SendPacket ();
 
   /**
@@ -99,12 +119,24 @@
   Time
   GetRetxTimer () const;
   
+  double
+  GetMaxSize () const;
+
+  void
+  SetMaxSize (double size);
+  
 protected:
-  UniformVariable m_rand;       ///< \brief this random variable is used for Nonce generation
-  uint32_t        m_seq;        ///< \brief packet sequence number specific for every application
-  EventId         m_sendEvent;  ///< \brief Eventid of pending "send packet" event
-  Time            m_retxTimer;  ///< \brief Timeout defining how frequent retransmission timeouts should be checked
-  EventId         m_retxEvent;  ///< \brief Event to check whether or not retransmission should be performed
+  UniformVariable m_rand; // nonce generator
+
+  ExponentialVariable m_randExp; // packet inter-arrival time generation (Poisson process)
+  DataRate            m_desiredRate;    // Desired data packet rate
+  uint32_t            m_payloadSize; // expected payload size
+  
+  uint32_t        m_seq;
+  uint32_t        m_seqMax;    // maximum number of sequence number
+  EventId         m_sendEvent; // Eventid of pending "send packet" event
+  Time            m_retxTimer;
+  EventId         m_retxEvent; // Event to check whether or not retransmission should be performed
 
   Time            m_rto;        ///< \brief Retransmission timeout
   Time            m_rttVar;     ///< \brief RTT variance
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index adac53e..2030e69 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -46,8 +46,8 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper [class]
-    module.add_class('CcnxConsumerHelper')
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper [class]
+    module.add_class('CcnxAppHelper')
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
     module.add_class('CcnxContentObjectHeaderException')
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
@@ -64,10 +64,10 @@
     module.add_enum('Type', ['INTEREST', 'CONTENT_OBJECT'], outer_class=root_module['ns3::CcnxHeaderHelper'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeaderException [class]
     module.add_class('CcnxInterestHeaderException')
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper [class]
-    module.add_class('CcnxProducerHelper')
     ## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper [class]
     module.add_class('CcnxStackHelper')
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper [class]
+    module.add_class('CcnxTraceHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException [class]
     module.add_class('CcnxUnknownHeaderException')
     ## event-id.h (module 'core'): ns3::EventId [class]
@@ -120,6 +120,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Chunk', 'ns3::ObjectBase', 'ns3::DefaultDeleter<ns3::Chunk>'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper [class]
+    module.add_class('SpringMobilityHelper')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -136,6 +138,10 @@
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## random-variable.h (module 'core'): ns3::UniformVariable [class]
     module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## vector.h (module 'core'): ns3::Vector2D [class]
+    module.add_class('Vector2D', import_from_module='ns.core')
+    ## vector.h (module 'core'): ns3::Vector3D [class]
+    module.add_class('Vector3D', import_from_module='ns.core')
     ## random-variable.h (module 'core'): ns3::WeibullVariable [class]
     module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
     ## random-variable.h (module 'core'): ns3::ZetaVariable [class]
@@ -182,10 +188,14 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxNameComponents', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxNameComponents>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
@@ -230,10 +240,12 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx [class]
     module.add_class('Ccnx', parent=root_module['ns3::Object'])
-    ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::ForwardingStrategy [enumeration]
-    module.add_enum('ForwardingStrategy', ['NDN_FLOODING', 'NDN_BESTROUTE', 'NDN_RANKING'], outer_class=root_module['ns3::Ccnx'])
+    ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::DropReason [enumeration]
+    module.add_enum('DropReason', ['DUPLICATED', 'SUPPRESSED', 'NO_FACES', 'NON_DUPLICATED', 'AFTER_SATISFIED', 'UNSOLICITED'], outer_class=root_module['ns3::Ccnx'])
     ## ccnx-app.h (module 'NDNabstraction'): ns3::CcnxApp [class]
     module.add_class('CcnxApp', parent=root_module['ns3::Application'])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer [class]
+    module.add_class('CcnxAppTracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader [class]
     module.add_class('CcnxContentObjectHeader', parent=root_module['ns3::Header'])
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectTail [class]
@@ -252,6 +264,8 @@
     module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
     module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::CcnxInterestHeader'])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer [class]
+    module.add_class('CcnxL3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents [class]
     module.add_class('CcnxNameComponents', parent=root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponentsChecker [class]
@@ -280,6 +294,8 @@
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
+    module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -301,7 +317,9 @@
     ## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [class]
     module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
     ## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [enumeration]
-    module.add_enum('', ['WEIGHTS', 'LATENCIES'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    module.add_enum('', ['WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel [class]
+    module.add_class('SpringMobilityModel', parent=root_module['ns3::MobilityModel'])
     ## nstime.h (module 'core'): ns3::TimeChecker [class]
     module.add_class('TimeChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -310,6 +328,14 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vector.h (module 'core'): ns3::Vector2DChecker [class]
+    module.add_class('Vector2DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## vector.h (module 'core'): ns3::Vector2DValue [class]
+    module.add_class('Vector2DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vector.h (module 'core'): ns3::Vector3DChecker [class]
+    module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## vector.h (module 'core'): ns3::Vector3DValue [class]
+    module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -317,6 +343,18 @@
     module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
     module.add_container('std::list< boost::reference_wrapper< std::string const > >', 'boost::reference_wrapper< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const >', container_type='list')
     module.add_container('std::list< std::string >', 'std::string', container_type='list')
+    typehandlers.add_type_alias('ns3::Vector3DChecker', 'ns3::VectorChecker')
+    typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
+    typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
+    module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
+    typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
+    typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
+    module.add_typedef(root_module['ns3::Vector3D'], 'Vector')
+    typehandlers.add_type_alias('ns3::Vector3DValue', 'ns3::VectorValue')
+    typehandlers.add_type_alias('ns3::Vector3DValue*', 'ns3::VectorValue*')
+    typehandlers.add_type_alias('ns3::Vector3DValue&', 'ns3::VectorValue&')
+    module.add_typedef(root_module['ns3::Vector3DValue'], 'VectorValue')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -351,15 +389,15 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
-    register_Ns3CcnxConsumerHelper_methods(root_module, root_module['ns3::CcnxConsumerHelper'])
+    register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
     register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
     register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
     register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
     register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
     register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
     register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
-    register_Ns3CcnxProducerHelper_methods(root_module, root_module['ns3::CcnxProducerHelper'])
     register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
+    register_Ns3CcnxTraceHelper_methods(root_module, root_module['ns3::CcnxTraceHelper'])
     register_Ns3CcnxUnknownHeaderException_methods(root_module, root_module['ns3::CcnxUnknownHeaderException'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
@@ -383,6 +421,7 @@
     register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
     register_Ns3SimpleRefCount__Ns3Chunk_Ns3ObjectBase_Ns3DefaultDeleter__lt__ns3Chunk__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Chunk, ns3::ObjectBase, ns3::DefaultDeleter<ns3::Chunk> >'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3SpringMobilityHelper_methods(root_module, root_module['ns3::SpringMobilityHelper'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
@@ -390,6 +429,8 @@
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
     register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+    register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
+    register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
     register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
     register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
     register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
@@ -413,8 +454,10 @@
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
+    register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -436,6 +479,7 @@
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3Ccnx_methods(root_module, root_module['ns3::Ccnx'])
     register_Ns3CcnxApp_methods(root_module, root_module['ns3::CcnxApp'])
+    register_Ns3CcnxAppTracer_methods(root_module, root_module['ns3::CcnxAppTracer'])
     register_Ns3CcnxContentObjectHeader_methods(root_module, root_module['ns3::CcnxContentObjectHeader'])
     register_Ns3CcnxContentObjectTail_methods(root_module, root_module['ns3::CcnxContentObjectTail'])
     register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
@@ -444,6 +488,7 @@
     register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
     register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
+    register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
     register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
     register_Ns3CcnxNameComponentsChecker_methods(root_module, root_module['ns3::CcnxNameComponentsChecker'])
     register_Ns3CcnxNameComponentsValue_methods(root_module, root_module['ns3::CcnxNameComponentsValue'])
@@ -458,6 +503,7 @@
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -467,10 +513,15 @@
     register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
     register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
     register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+    register_Ns3SpringMobilityModel_methods(root_module, root_module['ns3::SpringMobilityModel'])
     register_Ns3TimeChecker_methods(root_module, root_module['ns3::TimeChecker'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
+    register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
+    register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
+    register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     return
@@ -1012,27 +1063,31 @@
                    is_static=True, visibility='protected')
     return
 
-def register_Ns3CcnxConsumerHelper_methods(root_module, cls):
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(ns3::CcnxConsumerHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxConsumerHelper const &', 'arg0')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(std::string const & prefix) [constructor]
+def register_Ns3CcnxAppHelper_methods(root_module, cls):
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(ns3::CcnxAppHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxAppHelper const &', 'arg0')])
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::NodeContainer c) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('ns3::NodeContainer', 'c')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(std::string nodeName) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(std::string nodeName) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('std::string', 'nodeName')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): void ns3::CcnxConsumerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
     cls.add_method('SetAttribute', 
                    'void', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetPrefix(std::string const & prefix) [member function]
+    cls.add_method('SetPrefix', 
+                   'void', 
+                   [param('std::string const &', 'prefix')])
     return
 
 def register_Ns3CcnxContentObjectHeaderException_methods(root_module, cls):
@@ -1103,29 +1158,6 @@
     cls.add_constructor([param('ns3::CcnxInterestHeaderException const &', 'arg0')])
     return
 
-def register_Ns3CcnxProducerHelper_methods(root_module, cls):
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(ns3::CcnxProducerHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxProducerHelper const &', 'arg0')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(std::string const & prefix, uint32_t virtualPayloadSize) [constructor]
-    cls.add_constructor([param('std::string const &', 'prefix'), param('uint32_t', 'virtualPayloadSize')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::NodeContainer c) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('ns3::NodeContainer', 'c')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(std::string nodeName) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('std::string', 'nodeName')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): void ns3::CcnxProducerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
-    cls.add_method('SetAttribute', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
-    return
-
 def register_Ns3CcnxStackHelper_methods(root_module, cls):
     ## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper::CcnxStackHelper() [constructor]
     cls.add_constructor([])
@@ -1185,6 +1217,33 @@
                    [])
     return
 
+def register_Ns3CcnxTraceHelper_methods(root_module, cls):
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper(ns3::CcnxTraceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxTraceHelper const &', 'arg0')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper() [constructor]
+    cls.add_constructor([])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateAppAll(std::string const & app) [member function]
+    cls.add_method('EnableAggregateAppAll', 
+                   'void', 
+                   [param('std::string const &', 'app')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateL3All() [member function]
+    cls.add_method('EnableAggregateL3All', 
+                   'void', 
+                   [])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableRateL3All(std::string const & l3RateTrace="l3-rate.log") [member function]
+    cls.add_method('EnableRateL3All', 
+                   'void', 
+                   [param('std::string const &', 'l3RateTrace', default_value='"l3-rate.log"')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetAppTraceFile(std::string const & appTrace="apps.log") [member function]
+    cls.add_method('SetAppTraceFile', 
+                   'void', 
+                   [param('std::string const &', 'appTrace', default_value='"apps.log"')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetL3TraceFile(std::string const & l3Trace="l3.log") [member function]
+    cls.add_method('SetL3TraceFile', 
+                   'void', 
+                   [param('std::string const &', 'l3Trace', default_value='"l3.log"')])
+    return
+
 def register_Ns3CcnxUnknownHeaderException_methods(root_module, cls):
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException::CcnxUnknownHeaderException() [constructor]
     cls.add_constructor([])
@@ -2123,6 +2182,23 @@
                    is_static=True)
     return
 
+def register_Ns3SpringMobilityHelper_methods(root_module, cls):
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper() [constructor]
+    cls.add_constructor([])
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper(ns3::SpringMobilityHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SpringMobilityHelper const &', 'arg0')])
+    ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('InstallSprings', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(std::_List_const_iterator<ns3::TopologyReader::Link> first, std::_List_const_iterator<ns3::TopologyReader::Link> end) [member function]
+    cls.add_method('InstallSprings', 
+                   'void', 
+                   [param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'first'), param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'end')], 
+                   is_static=True)
+    return
+
 def register_Ns3Tag_methods(root_module, cls):
     ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
     cls.add_constructor([])
@@ -2423,6 +2499,52 @@
                    [param('double', 's'), param('double', 'l')])
     return
 
+def register_Ns3Vector2D_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Vector2D const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D(ns3::Vector2D const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D(double _x, double _y) [constructor]
+    cls.add_constructor([param('double', '_x'), param('double', '_y')])
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2D::x [variable]
+    cls.add_instance_attribute('x', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector2D::y [variable]
+    cls.add_instance_attribute('y', 'double', is_const=False)
+    return
+
+def register_Ns3Vector3D_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Vector3D const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D(ns3::Vector3D const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D(double _x, double _y, double _z) [constructor]
+    cls.add_constructor([param('double', '_x'), param('double', '_y'), param('double', '_z')])
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3D::x [variable]
+    cls.add_instance_attribute('x', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector3D::y [variable]
+    cls.add_instance_attribute('y', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector3D::z [variable]
+    cls.add_instance_attribute('z', 'double', is_const=False)
+    return
+
 def register_Ns3WeibullVariable_methods(root_module, cls):
     ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
@@ -2462,13 +2584,13 @@
     return
 
 def register_Ns3Int64x64_t_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
@@ -2859,6 +2981,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxAppTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -2883,6 +3017,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxL3Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -2956,11 +3102,11 @@
     return
 
 def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
     cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -3278,13 +3424,18 @@
     return
 
 def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
-    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="") [constructor]
-    cls.add_constructor([param('std::string const &', 'path', default_value='""')])
+    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
     ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
     cls.add_method('Read', 
                    'ns3::NodeContainer', 
                    [], 
                    is_virtual=True)
+    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+    cls.add_method('GetNodes', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_const=True)
     ## annotated-topology-reader.h (module 'NDNabstraction'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
     cls.add_method('AssignIpv4Addresses', 
                    'void', 
@@ -3599,6 +3750,55 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3CcnxAppTracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(ns3::CcnxAppTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxAppTracer const &', 'arg0')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, ns3::Ptr<ns3::Node> node, std::string const & appId="*") [constructor]
+    cls.add_constructor([param('std::string const &', 'app'), param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, std::string const & node, std::string const & appId="*") [constructor]
+    cls.add_constructor([param('std::string const &', 'app'), param('std::string const &', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
 def register_Ns3CcnxContentObjectHeader_methods(root_module, cls):
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader::CcnxContentObjectHeader(ns3::CcnxContentObjectHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CcnxContentObjectHeader const &', 'arg0')])
@@ -3707,13 +3907,9 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket(ns3::Time const & interval) [member function]
+    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket() [member function]
     cls.add_method('LeakBucket', 
                    'void', 
-                   [param('ns3::Time const &', 'interval')])
-    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucketByOnePacket() [member function]
-    cls.add_method('LeakBucketByOnePacket', 
-                   'void', 
                    [])
     ## ccnx-face.h (module 'NDNabstraction'): std::ostream & ns3::CcnxFace::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
@@ -4024,6 +4220,75 @@
                    [param('int8_t', 'scope')])
     return
 
+def register_Ns3CcnxL3Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::CcnxL3Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxL3Tracer const &', 'arg0')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(std::string const & node) [constructor]
+    cls.add_constructor([param('std::string const &', 'node')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ccnx::DropReason arg3, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ccnx::DropReason', 'arg3'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, bool fromCache, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
 def register_Ns3CcnxNameComponents_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
@@ -4335,6 +4600,62 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3MobilityModel_methods(root_module, cls):
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
+    cls.add_constructor([])
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+    cls.add_method('GetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+    cls.add_method('GetRelativeSpeed', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+    cls.add_method('GetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('SetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')])
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+    cls.add_method('NotifyCourseChange', 
+                   'void', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -4871,6 +5192,47 @@
     cls.add_method('Commit', 
                    'void', 
                    [])
+    ## rocketfuel-weights-reader.h (module 'NDNabstraction'): void ns3::RocketfuelWeightsReader::SavePositions(std::string const & file) const [member function]
+    cls.add_method('SavePositions', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_const=True)
+    return
+
+def register_Ns3SpringMobilityModel_methods(root_module, cls):
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel(ns3::SpringMobilityModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SpringMobilityModel const &', 'arg0')])
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel() [constructor]
+    cls.add_constructor([])
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::AddSpring(ns3::Ptr<ns3::MobilityModel> node) [member function]
+    cls.add_method('AddSpring', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'node')])
+    ## spring-mobility-model.h (module 'NDNabstraction'): static ns3::TypeId ns3::SpringMobilityModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoStart() [member function]
+    cls.add_method('DoStart', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
     return
 
 def register_Ns3TimeChecker_methods(root_module, cls):
@@ -4953,6 +5315,86 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector2D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Vector2D const &', 'value')])
+    return
+
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector3D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Vector3D const &', 'value')])
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index adac53e..2030e69 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -46,8 +46,8 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper [class]
-    module.add_class('CcnxConsumerHelper')
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper [class]
+    module.add_class('CcnxAppHelper')
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
     module.add_class('CcnxContentObjectHeaderException')
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
@@ -64,10 +64,10 @@
     module.add_enum('Type', ['INTEREST', 'CONTENT_OBJECT'], outer_class=root_module['ns3::CcnxHeaderHelper'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeaderException [class]
     module.add_class('CcnxInterestHeaderException')
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper [class]
-    module.add_class('CcnxProducerHelper')
     ## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper [class]
     module.add_class('CcnxStackHelper')
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper [class]
+    module.add_class('CcnxTraceHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException [class]
     module.add_class('CcnxUnknownHeaderException')
     ## event-id.h (module 'core'): ns3::EventId [class]
@@ -120,6 +120,8 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Chunk', 'ns3::ObjectBase', 'ns3::DefaultDeleter<ns3::Chunk>'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper [class]
+    module.add_class('SpringMobilityHelper')
     ## tag.h (module 'network'): ns3::Tag [class]
     module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
     ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -136,6 +138,10 @@
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## random-variable.h (module 'core'): ns3::UniformVariable [class]
     module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+    ## vector.h (module 'core'): ns3::Vector2D [class]
+    module.add_class('Vector2D', import_from_module='ns.core')
+    ## vector.h (module 'core'): ns3::Vector3D [class]
+    module.add_class('Vector3D', import_from_module='ns.core')
     ## random-variable.h (module 'core'): ns3::WeibullVariable [class]
     module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
     ## random-variable.h (module 'core'): ns3::ZetaVariable [class]
@@ -182,10 +188,14 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxNameComponents', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxNameComponents>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
@@ -230,10 +240,12 @@
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx [class]
     module.add_class('Ccnx', parent=root_module['ns3::Object'])
-    ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::ForwardingStrategy [enumeration]
-    module.add_enum('ForwardingStrategy', ['NDN_FLOODING', 'NDN_BESTROUTE', 'NDN_RANKING'], outer_class=root_module['ns3::Ccnx'])
+    ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::DropReason [enumeration]
+    module.add_enum('DropReason', ['DUPLICATED', 'SUPPRESSED', 'NO_FACES', 'NON_DUPLICATED', 'AFTER_SATISFIED', 'UNSOLICITED'], outer_class=root_module['ns3::Ccnx'])
     ## ccnx-app.h (module 'NDNabstraction'): ns3::CcnxApp [class]
     module.add_class('CcnxApp', parent=root_module['ns3::Application'])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer [class]
+    module.add_class('CcnxAppTracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader [class]
     module.add_class('CcnxContentObjectHeader', parent=root_module['ns3::Header'])
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectTail [class]
@@ -252,6 +264,8 @@
     module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
     module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::CcnxInterestHeader'])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer [class]
+    module.add_class('CcnxL3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents [class]
     module.add_class('CcnxNameComponents', parent=root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponentsChecker [class]
@@ -280,6 +294,8 @@
     module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
+    module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -301,7 +317,9 @@
     ## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [class]
     module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
     ## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [enumeration]
-    module.add_enum('', ['WEIGHTS', 'LATENCIES'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    module.add_enum('', ['WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel [class]
+    module.add_class('SpringMobilityModel', parent=root_module['ns3::MobilityModel'])
     ## nstime.h (module 'core'): ns3::TimeChecker [class]
     module.add_class('TimeChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -310,6 +328,14 @@
     module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## type-id.h (module 'core'): ns3::TypeIdValue [class]
     module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vector.h (module 'core'): ns3::Vector2DChecker [class]
+    module.add_class('Vector2DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## vector.h (module 'core'): ns3::Vector2DValue [class]
+    module.add_class('Vector2DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vector.h (module 'core'): ns3::Vector3DChecker [class]
+    module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## vector.h (module 'core'): ns3::Vector3DValue [class]
+    module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -317,6 +343,18 @@
     module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
     module.add_container('std::list< boost::reference_wrapper< std::string const > >', 'boost::reference_wrapper< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const >', container_type='list')
     module.add_container('std::list< std::string >', 'std::string', container_type='list')
+    typehandlers.add_type_alias('ns3::Vector3DChecker', 'ns3::VectorChecker')
+    typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
+    typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
+    module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+    typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
+    typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
+    typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
+    module.add_typedef(root_module['ns3::Vector3D'], 'Vector')
+    typehandlers.add_type_alias('ns3::Vector3DValue', 'ns3::VectorValue')
+    typehandlers.add_type_alias('ns3::Vector3DValue*', 'ns3::VectorValue*')
+    typehandlers.add_type_alias('ns3::Vector3DValue&', 'ns3::VectorValue&')
+    module.add_typedef(root_module['ns3::Vector3DValue'], 'VectorValue')
     
     ## Register a nested module for the namespace FatalImpl
     
@@ -351,15 +389,15 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
-    register_Ns3CcnxConsumerHelper_methods(root_module, root_module['ns3::CcnxConsumerHelper'])
+    register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
     register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
     register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
     register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
     register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
     register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
     register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
-    register_Ns3CcnxProducerHelper_methods(root_module, root_module['ns3::CcnxProducerHelper'])
     register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
+    register_Ns3CcnxTraceHelper_methods(root_module, root_module['ns3::CcnxTraceHelper'])
     register_Ns3CcnxUnknownHeaderException_methods(root_module, root_module['ns3::CcnxUnknownHeaderException'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
@@ -383,6 +421,7 @@
     register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
     register_Ns3SimpleRefCount__Ns3Chunk_Ns3ObjectBase_Ns3DefaultDeleter__lt__ns3Chunk__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Chunk, ns3::ObjectBase, ns3::DefaultDeleter<ns3::Chunk> >'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3SpringMobilityHelper_methods(root_module, root_module['ns3::SpringMobilityHelper'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
     register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
@@ -390,6 +429,8 @@
     register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
     register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
     register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+    register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
+    register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
     register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
     register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
     register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
@@ -413,8 +454,10 @@
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
+    register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -436,6 +479,7 @@
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
     register_Ns3Ccnx_methods(root_module, root_module['ns3::Ccnx'])
     register_Ns3CcnxApp_methods(root_module, root_module['ns3::CcnxApp'])
+    register_Ns3CcnxAppTracer_methods(root_module, root_module['ns3::CcnxAppTracer'])
     register_Ns3CcnxContentObjectHeader_methods(root_module, root_module['ns3::CcnxContentObjectHeader'])
     register_Ns3CcnxContentObjectTail_methods(root_module, root_module['ns3::CcnxContentObjectTail'])
     register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
@@ -444,6 +488,7 @@
     register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
     register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
+    register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
     register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
     register_Ns3CcnxNameComponentsChecker_methods(root_module, root_module['ns3::CcnxNameComponentsChecker'])
     register_Ns3CcnxNameComponentsValue_methods(root_module, root_module['ns3::CcnxNameComponentsValue'])
@@ -458,6 +503,7 @@
     register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
     register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -467,10 +513,15 @@
     register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
     register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
     register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+    register_Ns3SpringMobilityModel_methods(root_module, root_module['ns3::SpringMobilityModel'])
     register_Ns3TimeChecker_methods(root_module, root_module['ns3::TimeChecker'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
     register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
+    register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
+    register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
+    register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     return
@@ -1012,27 +1063,31 @@
                    is_static=True, visibility='protected')
     return
 
-def register_Ns3CcnxConsumerHelper_methods(root_module, cls):
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(ns3::CcnxConsumerHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxConsumerHelper const &', 'arg0')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(std::string const & prefix) [constructor]
+def register_Ns3CcnxAppHelper_methods(root_module, cls):
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(ns3::CcnxAppHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxAppHelper const &', 'arg0')])
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::NodeContainer c) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::NodeContainer c) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('ns3::NodeContainer', 'c')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(std::string nodeName) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(std::string nodeName) [member function]
     cls.add_method('Install', 
                    'ns3::ApplicationContainer', 
                    [param('std::string', 'nodeName')])
-    ## ccnx-consumer-helper.h (module 'NDNabstraction'): void ns3::CcnxConsumerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
     cls.add_method('SetAttribute', 
                    'void', 
                    [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetPrefix(std::string const & prefix) [member function]
+    cls.add_method('SetPrefix', 
+                   'void', 
+                   [param('std::string const &', 'prefix')])
     return
 
 def register_Ns3CcnxContentObjectHeaderException_methods(root_module, cls):
@@ -1103,29 +1158,6 @@
     cls.add_constructor([param('ns3::CcnxInterestHeaderException const &', 'arg0')])
     return
 
-def register_Ns3CcnxProducerHelper_methods(root_module, cls):
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(ns3::CcnxProducerHelper const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxProducerHelper const &', 'arg0')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(std::string const & prefix, uint32_t virtualPayloadSize) [constructor]
-    cls.add_constructor([param('std::string const &', 'prefix'), param('uint32_t', 'virtualPayloadSize')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::NodeContainer c) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('ns3::NodeContainer', 'c')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(std::string nodeName) [member function]
-    cls.add_method('Install', 
-                   'ns3::ApplicationContainer', 
-                   [param('std::string', 'nodeName')])
-    ## ccnx-producer-helper.h (module 'NDNabstraction'): void ns3::CcnxProducerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
-    cls.add_method('SetAttribute', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
-    return
-
 def register_Ns3CcnxStackHelper_methods(root_module, cls):
     ## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper::CcnxStackHelper() [constructor]
     cls.add_constructor([])
@@ -1185,6 +1217,33 @@
                    [])
     return
 
+def register_Ns3CcnxTraceHelper_methods(root_module, cls):
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper(ns3::CcnxTraceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxTraceHelper const &', 'arg0')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper() [constructor]
+    cls.add_constructor([])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateAppAll(std::string const & app) [member function]
+    cls.add_method('EnableAggregateAppAll', 
+                   'void', 
+                   [param('std::string const &', 'app')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateL3All() [member function]
+    cls.add_method('EnableAggregateL3All', 
+                   'void', 
+                   [])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableRateL3All(std::string const & l3RateTrace="l3-rate.log") [member function]
+    cls.add_method('EnableRateL3All', 
+                   'void', 
+                   [param('std::string const &', 'l3RateTrace', default_value='"l3-rate.log"')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetAppTraceFile(std::string const & appTrace="apps.log") [member function]
+    cls.add_method('SetAppTraceFile', 
+                   'void', 
+                   [param('std::string const &', 'appTrace', default_value='"apps.log"')])
+    ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetL3TraceFile(std::string const & l3Trace="l3.log") [member function]
+    cls.add_method('SetL3TraceFile', 
+                   'void', 
+                   [param('std::string const &', 'l3Trace', default_value='"l3.log"')])
+    return
+
 def register_Ns3CcnxUnknownHeaderException_methods(root_module, cls):
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException::CcnxUnknownHeaderException() [constructor]
     cls.add_constructor([])
@@ -2123,6 +2182,23 @@
                    is_static=True)
     return
 
+def register_Ns3SpringMobilityHelper_methods(root_module, cls):
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper() [constructor]
+    cls.add_constructor([])
+    ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper(ns3::SpringMobilityHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SpringMobilityHelper const &', 'arg0')])
+    ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+    cls.add_method('InstallSprings', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')], 
+                   is_static=True)
+    ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(std::_List_const_iterator<ns3::TopologyReader::Link> first, std::_List_const_iterator<ns3::TopologyReader::Link> end) [member function]
+    cls.add_method('InstallSprings', 
+                   'void', 
+                   [param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'first'), param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'end')], 
+                   is_static=True)
+    return
+
 def register_Ns3Tag_methods(root_module, cls):
     ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
     cls.add_constructor([])
@@ -2423,6 +2499,52 @@
                    [param('double', 's'), param('double', 'l')])
     return
 
+def register_Ns3Vector2D_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Vector2D const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D(ns3::Vector2D const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D(double _x, double _y) [constructor]
+    cls.add_constructor([param('double', '_x'), param('double', '_y')])
+    ## vector.h (module 'core'): ns3::Vector2D::Vector2D() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2D::x [variable]
+    cls.add_instance_attribute('x', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector2D::y [variable]
+    cls.add_instance_attribute('y', 'double', is_const=False)
+    return
+
+def register_Ns3Vector3D_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::Vector3D const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D(ns3::Vector3D const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D(double _x, double _y, double _z) [constructor]
+    cls.add_constructor([param('double', '_x'), param('double', '_y'), param('double', '_z')])
+    ## vector.h (module 'core'): ns3::Vector3D::Vector3D() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3D::x [variable]
+    cls.add_instance_attribute('x', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector3D::y [variable]
+    cls.add_instance_attribute('y', 'double', is_const=False)
+    ## vector.h (module 'core'): ns3::Vector3D::z [variable]
+    cls.add_instance_attribute('z', 'double', is_const=False)
+    return
+
 def register_Ns3WeibullVariable_methods(root_module, cls):
     ## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
@@ -2462,13 +2584,13 @@
     return
 
 def register_Ns3Int64x64_t_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
     cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
@@ -2859,6 +2981,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxAppTracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -2883,6 +3017,18 @@
                    is_static=True)
     return
 
+def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxL3Tracer > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
 def register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -2956,11 +3102,11 @@
     return
 
 def register_Ns3Time_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('!=')
     cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
     cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
     cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('>=')
     cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -3278,13 +3424,18 @@
     return
 
 def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
-    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="") [constructor]
-    cls.add_constructor([param('std::string const &', 'path', default_value='""')])
+    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+    cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
     ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
     cls.add_method('Read', 
                    'ns3::NodeContainer', 
                    [], 
                    is_virtual=True)
+    ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+    cls.add_method('GetNodes', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_const=True)
     ## annotated-topology-reader.h (module 'NDNabstraction'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
     cls.add_method('AssignIpv4Addresses', 
                    'void', 
@@ -3599,6 +3750,55 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3CcnxAppTracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(ns3::CcnxAppTracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxAppTracer const &', 'arg0')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, ns3::Ptr<ns3::Node> node, std::string const & appId="*") [constructor]
+    cls.add_constructor([param('std::string const &', 'app'), param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, std::string const & node, std::string const & appId="*") [constructor]
+    cls.add_constructor([param('std::string const &', 'app'), param('std::string const &', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
 def register_Ns3CcnxContentObjectHeader_methods(root_module, cls):
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader::CcnxContentObjectHeader(ns3::CcnxContentObjectHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CcnxContentObjectHeader const &', 'arg0')])
@@ -3707,13 +3907,9 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket(ns3::Time const & interval) [member function]
+    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket() [member function]
     cls.add_method('LeakBucket', 
                    'void', 
-                   [param('ns3::Time const &', 'interval')])
-    ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucketByOnePacket() [member function]
-    cls.add_method('LeakBucketByOnePacket', 
-                   'void', 
                    [])
     ## ccnx-face.h (module 'NDNabstraction'): std::ostream & ns3::CcnxFace::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
@@ -4024,6 +4220,75 @@
                    [param('int8_t', 'scope')])
     return
 
+def register_Ns3CcnxL3Tracer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::CcnxL3Tracer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxL3Tracer const &', 'arg0')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(std::string const & node) [constructor]
+    cls.add_constructor([param('std::string const &', 'node')])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ccnx::DropReason arg3, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+    cls.add_method('DropData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ccnx::DropReason', 'arg3'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('DropInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('DropNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+    cls.add_method('InData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('InInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('InNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, bool fromCache, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+    cls.add_method('OutData', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('OutInterests', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+    cls.add_method('OutNacks', 
+                   'void', 
+                   [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::PrintHeader(std::ostream & os) const [member function]
+    cls.add_method('PrintHeader', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
 def register_Ns3CcnxNameComponents_methods(root_module, cls):
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
@@ -4335,6 +4600,62 @@
                    [param('ns3::Ipv6Prefix const &', 'value')])
     return
 
+def register_Ns3MobilityModel_methods(root_module, cls):
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+    ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
+    cls.add_constructor([])
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'position')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+    cls.add_method('GetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+    cls.add_method('GetRelativeSpeed', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::MobilityModel const >', 'other')], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+    cls.add_method('GetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('SetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')])
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+    cls.add_method('NotifyCourseChange', 
+                   'void', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -4871,6 +5192,47 @@
     cls.add_method('Commit', 
                    'void', 
                    [])
+    ## rocketfuel-weights-reader.h (module 'NDNabstraction'): void ns3::RocketfuelWeightsReader::SavePositions(std::string const & file) const [member function]
+    cls.add_method('SavePositions', 
+                   'void', 
+                   [param('std::string const &', 'file')], 
+                   is_const=True)
+    return
+
+def register_Ns3SpringMobilityModel_methods(root_module, cls):
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel(ns3::SpringMobilityModel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SpringMobilityModel const &', 'arg0')])
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel() [constructor]
+    cls.add_constructor([])
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::AddSpring(ns3::Ptr<ns3::MobilityModel> node) [member function]
+    cls.add_method('AddSpring', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'node')])
+    ## spring-mobility-model.h (module 'NDNabstraction'): static ns3::TypeId ns3::SpringMobilityModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetPosition() const [member function]
+    cls.add_method('DoGetPosition', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetVelocity() const [member function]
+    cls.add_method('DoGetVelocity', 
+                   'ns3::Vector', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+    cls.add_method('DoSetPosition', 
+                   'void', 
+                   [param('ns3::Vector const &', 'position')], 
+                   visibility='private', is_virtual=True)
+    ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoStart() [member function]
+    cls.add_method('DoStart', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
     return
 
 def register_Ns3TimeChecker_methods(root_module, cls):
@@ -4953,6 +5315,86 @@
                    [param('ns3::TypeId const &', 'value')])
     return
 
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector2D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Vector2D const &', 'value')])
+    return
+
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+    return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+    cls.add_constructor([])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+    ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+    cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+    ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Vector3D', 
+                   [], 
+                   is_const=True)
+    ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Vector3D const &', 'value')])
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
diff --git a/examples/abilene-topology.cc b/examples/abilene-topology.cc
index 8c83930..48ad6db 100644
--- a/examples/abilene-topology.cc
+++ b/examples/abilene-topology.cc
@@ -26,10 +26,8 @@
 #include "ns3/point-to-point-grid.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/animation-interface.h"
-// #include "ns3/ccnx-l3-protocol.h"
 
-#include <iostream>
-#include <sstream>
+#include "../helper/ccnx-trace-helper.h"
 #include "ns3/annotated-topology-reader.h"
 #include "../utils/spring-mobility-helper.h"
 
@@ -40,13 +38,6 @@
 
 NS_LOG_COMPONENT_DEFINE ("CcnxAbileneTopology");
 
-// int transmittedInterests = 0;
-// int receivedInterests = 0;
-// int droppedInterests = 0;
-
-// int transmittedData = 0;
-// int receivedData = 0;
-// int droppedData = 0;
 
 void PrintTime ()
 {
@@ -55,132 +46,26 @@
   Simulator::Schedule (Seconds (10.0), PrintTime);
 }
 
-void PrintFIBs ()
-{
-  NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
-  Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
-
-      Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
-      NS_ASSERT_MSG (fib != 0, "Fire alarm");
-      *routingStream->GetStream () << *fib << "\n\n";
-    }
-}
-
-
-struct AggregateTrace
-{
-  AggregateTrace ()
-    : m_transmittedInterests (0)
-    , m_transmittedData (0)
-    , m_receivedInterests (0)
-    , m_receivedNacks (0)
-    , m_receivedData (0)
-  {
-  }
-  
-  void
-  TransmittedInterests (std::string context,
-                        Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>)
-  {
-    m_transmittedInterests++;
-  }
-
-  void
-  TransmittedData (std::string context,
-                   Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                   Ptr<CcnxApp>, Ptr<CcnxFace>)
-  {
-    m_transmittedData++;
-  }
-
-  void
-  ReceivedInterests (std::string context,
-                     Ptr<const CcnxInterestHeader>,
-                     Ptr<CcnxApp>, Ptr<CcnxFace>)
-  {
-    m_receivedInterests++;
-  }
-
-  void
-  ReceivedNacks (std::string context,
-                 Ptr<const CcnxInterestHeader>,
-                 Ptr<CcnxApp>, Ptr<CcnxFace>)
-  {
-    m_receivedNacks++;
-  }
-  
-  void
-  ReceivedData (std::string context,
-                Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                Ptr<CcnxApp>, Ptr<CcnxFace>)
-  {
-    m_receivedData++;
-  }
-
-  uint64_t m_transmittedInterests;
-  uint64_t m_transmittedData;
-  uint64_t m_receivedInterests;
-  uint64_t m_receivedNacks;
-  uint64_t m_receivedData;
-};
-
-ostream&
-operator << (ostream &os, const AggregateTrace &trace)
-{
-  os << ">> (i): " << trace.m_transmittedInterests << "\n";
-  os << ">> (d): " << trace.m_transmittedData << "\n";
-  os << "<< (i): " << trace.m_receivedInterests << "\n";
-  os << "<< (d): " << trace.m_receivedData << "\n";
-  os << "<< (n): " << trace.m_receivedNacks << "\n";
-  return os;
-}
-
-// static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-//                                    Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// void PrintFIBs ()
 // {
-//   transmittedInterests++;
+//   NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
+//   Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
+//   for (NodeList::Iterator node = NodeList::Begin ();
+//        node != NodeList::End ();
+//        node++)
+//     {
+//       // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
+
+//       Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
+//       NS_ASSERT_MSG (fib != 0, "Fire alarm");
+//       *routingStream->GetStream () << *fib << "\n\n";
+//     }
 // }
 
-// static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-//                                 Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//   receivedInterests++;
-// }
-
-// static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
-//                                Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//   droppedInterests++;
-// }
-
-// static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                                CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//     transmittedData++;    
-// }
-
-// static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                             Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//     receivedData++;
-// }
-
-// static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                            CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
-// {
-//     droppedData++;
-// }
 
 int 
 main (int argc, char *argv[])
 {
-  // Packet::EnableChecking();
-  // Packet::EnablePrinting();
   string input ("./src/NDNabstraction/examples/abilene-topology.txt");
 
   Time finishTime = Seconds (20.0);
@@ -199,8 +84,8 @@
   // -- Read topology data.
   // --------------------------------------------
     
-  AnnotatedTopologyReader reader ("/abilene");
-  reader.SetMobilityModel ("ns3::SpringMobilityModel");
+  AnnotatedTopologyReader reader ("/abilene", 2.0);
+  // reader.SetMobilityModel ("ns3::SpringMobilityModel");
   reader.SetFileName (input);
     
   NodeContainer nodes = reader.Read ();
@@ -211,7 +96,7 @@
       return -1;
     }
 
-  SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
+  // SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
 
   // InternetStackHelper stack;
   // Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
@@ -232,11 +117,15 @@
   ccnxHelper.InstallAll ();
     
   NS_LOG_INFO ("Installing Applications");
-  CcnxConsumerHelper consumerHelper ("/5");
-  ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/abilene", "ATLAng"));
-    
-  // CcnxProducerHelper producerHelper ("/5",1024);
-  // ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "IPLSng"));
+  CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+  consumerHelper.SetPrefix ("/Data");
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
+  ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/abilene", "SNVAng"));
+  
+  CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+  producerHelper.SetPrefix ("/Data");
+
+  ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "NYCMng"));
 
   // // Populate FIB based on IPv4 global routing controller
   // ccnxHelper.InstallFakeGlobalRoutes ();
@@ -245,7 +134,7 @@
   // Simulator::Schedule (Seconds (1.0), PrintFIBs);
   // PrintFIBs ();
 
-  // Simulator::Schedule (Seconds (10.0), PrintTime);
+  Simulator::Schedule (Seconds (10.0), PrintTime);
 
   Simulator::Stop (finishTime);
 
@@ -256,36 +145,12 @@
       anim->SetMobilityPollInterval (Seconds (1));
     }
 
-  // NS_LOG_INFO ("Configure Tracing.");
-  AggregateTrace trace;
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/TransmittedInterests",
-                   MakeCallback (&AggregateTrace::TransmittedInterests, &trace));
-
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedNacks",
-                   MakeCallback (&AggregateTrace::ReceivedNacks, &trace));
-
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/ReceivedInterests",
-                   MakeCallback (&AggregateTrace::ReceivedInterests, &trace));
-  
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/TransmittedContentObjects",
-                   MakeCallback (&AggregateTrace::TransmittedData, &trace));
-
-  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedContentObjects",
-                   MakeCallback (&AggregateTrace::ReceivedData, &trace));
-
-  // Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
-  //                                MakeCallback (&OnTransmittedInterest));
-  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
-  //                    MakeCallback (&OnReceivedInterest));
-  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
-  //                    MakeCallback (&OnDroppedInterest));
-    
-  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
-  //                    MakeCallback (&OnReceivedData));
-  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
-  //                    MakeCallback (&OnTransmittedData));
-  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
-  //                    MakeCallback (&OnDroppedData));
+  CcnxTraceHelper traceHelper;
+  traceHelper.EnableAggregateAppAll ("ns3::CcnxConsumer");
+  traceHelper.EnableAggregateAppAll ("ns3::CcnxProducer");
+  traceHelper.EnableAggregateL3All ();
+  traceHelper.SetL3TraceFile ("trace-l3.log");
+  traceHelper.SetAppTraceFile ("trace-app.log");
   
   config.ConfigureAttributes ();  
   
@@ -294,12 +159,5 @@
   Simulator::Destroy ();
   NS_LOG_INFO ("Done.");
 
-  // NS_LOG_INFO("Total received interests = " << receivedInterests);
-  // NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
-  // NS_LOG_INFO("Total dropped interests = " << droppedInterests);
-  // NS_LOG_INFO("Total received data = " << receivedData);
-  // NS_LOG_INFO("Total transmitted data = " << transmittedData);
-  // NS_LOG_INFO("Total dropped data = " << droppedData);
-  NS_LOG_INFO (trace);
   return 0;
 }
diff --git a/examples/annotated-topology-read-example.cc b/examples/annotated-topology-read-example.cc
index c220873..450d8d1 100644
--- a/examples/annotated-topology-read-example.cc
+++ b/examples/annotated-topology-read-example.cc
@@ -93,15 +93,19 @@
   Ptr<CcnxFaceContainer> cf = ccnx.Install (nodes);
      
   NS_LOG_INFO ("Installing Applications");
-  CcnxConsumerHelper helper ("/3");
-  ApplicationContainer app = helper.Install (nodes.Get(1));
+  CcnxAppHelper helper ("ns3::CcnxConsumer");
+  helper.SetPrefix ("/3");
+  ApplicationContainer app = helper.Install ("1");
   app.Start (Seconds (1.0));
   app.Stop (Seconds (1000.05));
-    
-  CcnxProducerHelper helper3 ("/3",120);
-  ApplicationContainer app3 = helper3.Install(nodes.Get(6));
-  app3.Start(Seconds(0.0));
-  app3.Stop(Seconds(1500.0));
+
+  CcnxAppHelper helper2 ("ns3::CcnxProducer");
+  helper2.SetPrefix ("/3");
+  helper2.SetAttribute ("PayloadSize", StringValue("1024"));
+  ApplicationContainer app2 = helper2.Install("3");
+
+  app2.Start(Seconds(0.0));
+  app2.Stop(Seconds(1500.0));
     
   // ------------------------------------------------------------
   // -- Run the simulation
diff --git a/examples/ccnx-grid.cc b/examples/ccnx-grid.cc
index 51d7858..a4255be 100644
--- a/examples/ccnx-grid.cc
+++ b/examples/ccnx-grid.cc
@@ -64,7 +64,6 @@
 {
   Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
   Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::CcnxConsumer::OffTime", StringValue ("1s"));
   Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
     
   Packet::EnableChecking();
@@ -116,13 +115,17 @@
   std::ostringstream prefix;
   prefix << "/" << producer->GetId ();
   
-  CcnxConsumerHelper consumerHelper (prefix.str ());
+  CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+  consumerHelper.SetPrefix (prefix.str ());
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
   ApplicationContainer consumers = consumerHelper.Install (consumerNodes);
   
   // consumers.Start (Seconds (0.0));
   // consumers.Stop (finishTime);
     
-  CcnxProducerHelper producerHelper (prefix.str (),1024);
+  CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+  producerHelper.SetPrefix (prefix.str ());
+  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
   ApplicationContainer producers = producerHelper.Install (producer);
   
   // producers.Start(Seconds(0.0));
diff --git a/examples/ccnx-test.cc b/examples/ccnx-test.cc
index d5cb1ad..cae2815 100644
--- a/examples/ccnx-test.cc
+++ b/examples/ccnx-test.cc
@@ -46,13 +46,17 @@
   CcnxStackHelper ccnx;
   Ptr<CcnxFaceContainer> cf = ccnx.Install (c);
 
-  CcnxConsumerHelper helper ("/3");
+  CcnxAppHelper helper ("ns3::CcnxConsumer");
+  helper.SetPrefix ("/3");
   ApplicationContainer app = helper.Install ("1");
   app.Start (Seconds (1.0));
   app.Stop (Seconds (10.05));
-    
-  CcnxProducerHelper helper2 ("/3",120);
+
+  CcnxAppHelper helper2 ("ns3::CcnxProducer");
+  helper2.SetPrefix ("/3");
+  helper2.SetAttribute ("PayloadSize", StringValue("1024"));
   ApplicationContainer app2 = helper2.Install("3");
+  
   app2.Start(Seconds(0.0));
   app2.Stop(Seconds(15.0));
   
diff --git a/examples/congestion-pop.cc b/examples/congestion-pop.cc
new file mode 100644
index 0000000..51a5fa0
--- /dev/null
+++ b/examples/congestion-pop.cc
@@ -0,0 +1,230 @@
+/* -*-  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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/NDNabstraction-module.h"
+#include "ns3/point-to-point-grid.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/random-variable.h"
+#include "ns3/internet-module.h"
+#include "ns3/applications-module.h"
+
+#include <iostream>
+#include <sstream>
+#include <map>
+#include <list>
+#include <set>
+#include "ns3/rocketfuel-topology-reader.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+
+using namespace ns3;
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("Scenario");
+
+void PrintTime ()
+{
+  cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+class Experiment
+{
+public:
+  Experiment ()
+    : m_rand (0,52)
+    , reader ("/sprint")
+  { }
+  
+  void
+  ConfigureCcnxTopology ()
+  {
+    Names::Clear ();
+    
+    string weights   ("./src/NDNabstraction/examples/sprint-pops.weights");
+    string latencies ("./src/NDNabstraction/examples/sprint-pops.latencies");
+    string positions ("./src/NDNabstraction/examples/sprint-pops.positions");
+  
+    RocketfuelWeightsReader reader ("/sprint");
+
+    reader.SetFileName (positions);
+    reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+    reader.Read ();
+  
+    reader.SetFileName (weights);
+    reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
+    reader.Read ();
+
+    reader.SetFileName (latencies);
+    reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
+    reader.Read ();
+    
+    reader.Commit ();
+    NS_ASSERT_MSG (reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+    
+    NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
+    NS_LOG_INFO("Links = " << reader.LinksSize ());
+  
+    // ------------------------------------------------------------
+    // -- Read topology data.
+    // --------------------------------------------
+        
+    InternetStackHelper stack;
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    stack.Install (reader.GetNodes ());
+
+    reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+    
+    // Install CCNx stack
+    NS_LOG_INFO ("Installing CCNx stack");
+    CcnxStackHelper ccnxHelper;
+    ccnxHelper.SetForwardingStrategy ("ns3::CcnxBestRouteStrategy");
+    ccnxHelper.EnableLimits (true, Seconds(0.1));
+    ccnxHelper.SetDefaultRoutes (false);
+    ccnxHelper.InstallAll ();
+  }
+
+  void
+  ConfigureRouting ()
+  {
+    CcnxStackHelper ccnxHelper;
+    // // Populate FIB based on IPv4 global routing controller
+    ccnxHelper.InstallFakeGlobalRoutes ();
+    ccnxHelper.InstallRoutesToAll ();
+  }
+  
+  ApplicationContainer
+  AddCcnxRandomApplications (uint16_t numStreams)
+  {
+    map<uint32_t, set<uint32_t> > streams;
+    ApplicationContainer apps;
+    
+    uint16_t createdStreams = 0;
+    uint16_t guard = 0;
+    while (createdStreams < numStreams && guard < (numeric_limits<uint16_t>::max ()-1))
+      {
+        guard ++;
+        
+        uint32_t node1_num = m_rand.GetValue ();
+        uint32_t node2_num = m_rand.GetValue ();
+
+        if (node1_num == node2_num)
+          continue;
+
+        if (streams[node1_num].count (node2_num) > 0) // don't create duplicate streams
+          continue;
+        
+        streams[node1_num].insert (node2_num);
+
+        Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (node1_num));
+        Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (node2_num));
+
+        CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+        consumerHelper.SetPrefix ("/" + lexical_cast<string> (node2->GetId ()));
+        consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+        consumerHelper.SetAttribute ("Size", StringValue ("1.983642578125")); //to make sure max seq # is 2000
+
+        CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+        producerHelper.SetPrefix ("/" + lexical_cast<string> (node2->GetId ()));
+        
+        apps.Add
+          (consumerHelper.Install (node1));
+
+        apps.Add
+          (producerHelper.Install (node2));
+
+        createdStreams ++;
+      }
+
+    return apps;
+  }
+
+  void
+  Run (const Time &finishTime)
+  {
+    cout << "Run Simulation.\n";
+    Simulator::Stop (finishTime);
+    // Simulator::Schedule (Seconds (1.0), PrintTime);
+    Simulator::Run ();
+    Simulator::Destroy ();
+    cout << "Done.\n";
+  }
+
+  UniformVariable m_rand;
+  RocketfuelWeightsReader reader;
+};
+
+
+int 
+main (int argc, char *argv[])
+{
+  cout << "Begin congestion-pop scenario\n";
+  
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+
+  uint32_t maxRuns = 1;
+  uint32_t startRun = 0;
+  CommandLine cmd;
+  cmd.AddValue ("start", "Initial run number", startRun);
+  cmd.AddValue ("runs", "Number of runs", maxRuns);
+  cmd.Parse (argc, argv);
+
+  for (uint32_t run = startRun; run < startRun + maxRuns; run++)
+    {
+      Config::SetGlobal ("RngRun", IntegerValue (run));
+      cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+
+      Experiment experiment;
+      cout << "Run " << run << endl;
+      
+      experiment.ConfigureCcnxTopology ();
+      ApplicationContainer apps = experiment.AddCcnxRandomApplications (20);
+      experiment.ConfigureRouting ();
+  
+      string prefix = "run-" + lexical_cast<string> (run) + "-";
+
+      ofstream of_nodes ((prefix + "apps.log").c_str ());
+      for (uint32_t i = 0; i < apps.GetN () / 2; i++) 
+        {
+          of_nodes << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+                   << " to "  << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+          of_nodes << "\n";
+        }
+      of_nodes.close ();
+
+      CcnxTraceHelper traceHelper;
+      traceHelper.EnableRateL3All (prefix + "rate-trace.log");
+      traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
+
+      experiment.Run (Seconds (200.0));
+    }
+
+  // cout << "Finish congestion-pop scenario\n";
+  return 0;
+}
diff --git a/examples/congestion-tcp-pop.cc b/examples/congestion-tcp-pop.cc
new file mode 100644
index 0000000..c1ac443
--- /dev/null
+++ b/examples/congestion-tcp-pop.cc
@@ -0,0 +1,231 @@
+/* -*-  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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/NDNabstraction-module.h"
+#include "ns3/point-to-point-grid.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/random-variable.h"
+#include "ns3/internet-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/config-store.h"
+
+#include <iostream>
+#include <sstream>
+#include <map>
+#include <list>
+#include <set>
+#include "ns3/rocketfuel-topology-reader.h"
+
+#include "../helper/tracers/ipv4-seqs-app-tracer.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+
+using namespace ns3;
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("Scenario");
+
+void PrintTime ()
+{
+  cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+class Experiment
+{
+public:
+  Experiment ()
+    : m_rand (0,52)
+    , reader ("/sprint")
+  { }
+
+  void
+  ConfigureIpv4Topology ()
+  {
+    Names::Clear ();
+    
+    string weights   ("./src/NDNabstraction/examples/sprint-pops.weights");
+    string latencies ("./src/NDNabstraction/examples/sprint-pops.latencies");
+    string positions ("./src/NDNabstraction/examples/sprint-pops.positions");
+  
+    reader.SetFileName (positions);
+    reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+    reader.Read ();
+  
+    reader.SetFileName (weights);
+    reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
+    reader.Read ();
+
+    reader.SetFileName (latencies);
+    reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
+    reader.Read ();
+    
+    reader.Commit ();
+    NS_ASSERT_MSG (reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+    
+    NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
+    NS_LOG_INFO("Links = " << reader.LinksSize ());
+
+    InternetStackHelper stack;
+    stack.Install (reader.GetNodes ());
+    reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+  }
+
+  void
+  ConfigureRouting ()
+  {
+    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+    // m_rand = UniformVariable (0, reader.GetNodes ().GetN());
+  }
+  
+  ApplicationContainer
+  AddTcpRandomApplications (uint16_t numStreams)
+  {
+    map<uint32_t, set<uint32_t> > streams;
+    ApplicationContainer apps;
+
+    const static uint32_t base_port = 10;
+    uint16_t createdStreams = 0;
+    uint16_t guard = 0;
+    while (createdStreams < numStreams && guard < (numeric_limits<uint16_t>::max ()-1))
+      {
+        guard ++;
+        
+        uint32_t node1_num = m_rand.GetValue ();
+        uint32_t node2_num = m_rand.GetValue ();
+
+        if (node1_num == node2_num)
+          continue;
+
+        if (streams[node1_num].count (node2_num) > 0) // don't create duplicate streams
+          continue;
+        
+        streams[node1_num].insert (node2_num);
+
+        Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (node1_num));
+        Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (node2_num));
+
+        Ptr<Ipv4> ipv4 = node1->GetObject<Ipv4> ();
+        // ipv4->GetAddress (0, 0);
+
+        // to make sure we don't reuse the same port numbers for different flows, just make all port numbers unique
+        PacketSinkHelper consumerHelper ("ns3::TcpSocketFactory",
+                                         InetSocketAddress (Ipv4Address::GetAny (), base_port + createdStreams));
+
+        BulkSendHelper producerHelper ("ns3::TcpSocketFactory",
+                                       InetSocketAddress (ipv4->GetAddress (1, 0).GetLocal (), base_port + createdStreams));
+        // cout << "SendTo: " <<  ipv4->GetAddress (1, 0).GetLocal () << endl;
+        producerHelper.SetAttribute ("MaxBytes", UintegerValue (2081040)); // equal to 2001 ccnx packets
+        
+        apps.Add
+          (consumerHelper.Install (node1));
+
+        apps.Add
+          (producerHelper.Install (node2));
+
+        createdStreams ++;
+      }
+
+    return apps;
+  }
+
+  void
+  Run (const Time &finishTime)
+  {
+    cout << "Run Simulation.\n";
+    Simulator::Stop (finishTime);
+    // Simulator::Schedule (Seconds (1.0), PrintTime);
+    Simulator::Run ();
+    Simulator::Destroy ();
+    cout << "Done.\n";
+  }
+
+  UniformVariable m_rand;
+  RocketfuelWeightsReader reader;
+};
+
+int 
+main (int argc, char *argv[])
+{
+  cout << "Begin congestion-pop scenario\n";
+  Packet::EnableChecking();
+  Packet::EnablePrinting();
+  
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+  Config::SetDefault ("ns3::TcpSocket::SegmentSize", StringValue ("1040"));
+  
+  Config::SetDefault ("ns3::BulkSendApplication::SendSize", StringValue ("1040"));
+
+  // Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("attributes.xml"));
+  // Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
+  // Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
+  
+  uint32_t maxRuns = 1;
+  uint32_t startRun = 0;
+  CommandLine cmd;
+  cmd.AddValue ("start", "Initial run number", startRun);
+  cmd.AddValue ("runs", "Number of runs", maxRuns);
+  cmd.Parse (argc, argv);
+
+  // ConfigStore config;
+  // config.ConfigureDefaults ();
+
+  for (uint32_t run = startRun; run < startRun + maxRuns; run++)
+    {
+      Config::SetGlobal ("RngRun", IntegerValue (run));
+      cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+      
+      Experiment experiment;
+      cout << "Run " << run << endl;
+      
+      experiment.ConfigureIpv4Topology ();
+      ApplicationContainer apps = experiment.AddTcpRandomApplications (20);
+      experiment.ConfigureRouting ();
+
+      string prefix = "run-tcp-" + lexical_cast<string> (run) + "-";      
+
+      ofstream of_nodes ((prefix + "apps.log").c_str ());
+      for (uint32_t i = 0; i < apps.GetN () / 2; i++) 
+        {
+          of_nodes << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+                   << " to "  << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+          of_nodes << "\n";
+        }
+
+      CcnxTraceHelper traceHelper;
+      traceHelper.EnableIpv4SeqsAppAll (prefix + "consumers-seqs.log");
+
+      // config.ConfigureAttributes ();  
+
+      experiment.Run (Seconds (200.0));
+    }
+
+  // cout << "Finish congestion-pop scenario\n";
+  return 0;
+}
diff --git a/examples/sprint-pops.latencies b/examples/sprint-pops.latencies
new file mode 100644
index 0000000..7c3fd07
--- /dev/null
+++ b/examples/sprint-pops.latencies
@@ -0,0 +1,84 @@
+0 1 0.312
+2 3 10.786
+1 4 0.222
+1 5 1.035
+1 6 1.414
+1 7 1.24
+1 8 0.814
+1 9 19.532
+1 10 0.352
+1 11 4.593
+12 13 2.622
+14 15 0.207
+14 16 12.098
+14 17 13.941
+15 18 7.791
+15 19 38.946
+20 21 19.775
+20 22 0.345
+23 24 5.337
+25 26 0.276
+27 28 0.645
+8 20 19.787
+8 16 8.352
+8 28 1.578
+8 24 10.459
+8 26 5.005
+21 31 20.741
+13 32 4.737
+13 33 1.424
+17 35 2.091
+17 20 14.409
+17 18 7.13
+17 28 6.214
+17 24 6.437
+17 25 1.315
+17 26 1.176
+17 29 3.282
+17 36 2.478
+11 24 5.751
+11 38 3.235
+11 17 4.718
+33 39 1.817
+33 40 2.035
+6 7 0.327
+6 28 0.97
+6 25 5.176
+6 8 0.612
+6 17 5.725
+6 34 0.802
+6 11 6.007
+39 42 0.699
+16 24 3.655
+16 29 0.135
+16 17 3.286
+31 45 0.268
+31 46 0.268
+31 37 3.375
+31 47 2.708
+32 48 1.712
+32 44 2.329
+32 42 1.595
+48 49 3.201
+7 13 31.13
+38 43 1.643
+9 15 5.513
+9 20 0.437
+9 31 2.648
+9 30 0.124
+9 17 14.774
+9 19 42.03
+5 32 28.338
+5 8 0.359
+5 7 0.316
+18 23 0.779
+40 48 2.34
+40 49 2.529
+24 38 7.706
+24 31 9.827
+24 45 10.045
+24 50 0.092
+3 9 59.812
+19 41 26.19
+19 20 42.057
+19 51 14.125
diff --git a/examples/sprint-pops.positions b/examples/sprint-pops.positions
new file mode 100644
index 0000000..928e443
--- /dev/null
+++ b/examples/sprint-pops.positions
@@ -0,0 +1,53 @@
+router
+0	unknown	-135.764	253.112
+1	unknown	-124.26	242.106
+2	unknown	-133.746	192.374
+3	unknown	-125.181	203.615
+4	unknown	-139.012	235.48
+5	unknown	-114.553	255.538
+6	unknown	-117.383	242.123
+7	unknown	-124.098	258.288
+8	unknown	-109.597	235.032
+9	unknown	-114.699	219.473
+10	unknown	-141.269	245.046
+11	unknown	-104.331	242.371
+12	unknown	-133.569	286.269
+13	unknown	-123.315	277.497
+14	unknown	-98.0591	218.885
+15	unknown	-103.065	209.249
+16	unknown	-97.6019	232.002
+17	unknown	-104.764	227.93
+18	unknown	-89.9659	217.538
+19	unknown	-111.243	201.883
+20	unknown	-105.782	215.929
+21	unknown	-96.3977	226.003
+22	unknown	-97.9862	200.901
+23	unknown	-78.8835	225.308
+24	unknown	-90.3514	236.091
+25	unknown	-117.767	232.718
+26	unknown	-114.42	224.798
+27	unknown	-136.333	222.043
+28	unknown	-122.444	228.514
+31	unknown	-97.4791	241.611
+32	unknown	-110.351	277.334
+33	unknown	-117.777	292.69
+35	unknown	-94.4122	211.85
+29	unknown	-88.3097	226.526
+36	unknown	-110.615	242.037
+38	unknown	-88.4545	248.603
+39	unknown	-103.356	298.492
+40	unknown	-116.839	305.342
+34	unknown	-131.979	243.096
+42	unknown	-100.976	287.547
+45	unknown	-82.2028	243.344
+46	unknown	-96.0201	256.972
+37	unknown	-103.425	254.683
+47	unknown	-88.0706	256.064
+48	unknown	-110.226	295.199
+44	unknown	-97.4778	278.521
+49	unknown	-106.546	309.269
+43	unknown	-76.3178	258.2
+30	unknown	-127.539	212.622
+50	unknown	-74.0048	237.243
+41	unknown	-105.291	188.236
+51	unknown	-115.94	188.128
diff --git a/examples/sprint-pops.weights b/examples/sprint-pops.weights
new file mode 100644
index 0000000..387a37f
--- /dev/null
+++ b/examples/sprint-pops.weights
@@ -0,0 +1,84 @@
+0 1 312
+2 3 10786
+1 4 222
+1 5 2500
+1 6 4000
+1 7 2500
+1 8 3860
+1 9 11769
+1 10 352
+1 11 3500
+12 13 2622
+14 15 500
+14 16 14192
+14 17 8909
+15 18 11747
+15 19 44530
+20 21 19775
+20 22 345
+23 24 5337
+25 26 2184
+27 28 645
+8 20 11409
+8 16 8282
+8 28 3000
+8 24 7735
+8 26 5500
+21 31 20741
+13 32 7552
+13 33 1500
+17 35 2091
+17 20 14409
+17 18 4337
+17 28 4000
+17 24 5735
+17 25 1315
+17 26 2500
+17 29 3282
+17 36 2478
+11 24 5096
+11 38 3235
+11 17 4360
+33 39 2000
+33 40 3000
+6 7 2500
+6 28 6860
+6 25 5176
+6 8 5860
+6 17 3860
+6 34 802
+6 11 5500
+39 42 699
+16 24 1547
+16 29 3000
+16 17 5282
+31 45 500
+31 46 268
+31 37 3375
+31 47 2708
+32 48 1712
+32 44 2329
+32 42 3352
+48 49 3201
+7 13 30890
+38 43 1643
+9 15 5500
+9 20 2500
+9 31 4735
+9 30 124
+9 17 13909
+9 19 42030
+5 32 28338
+5 8 2360
+5 7 2000
+18 23 5735
+40 48 2340
+40 49 2529
+24 38 2860
+24 31 9909
+24 45 10409
+24 50 92
+3 9 59812
+19 41 26190
+19 20 39530
+19 51 14125
diff --git a/examples/sprint-topology.cc b/examples/sprint-topology.cc
index 3a53c35..b3baa7c 100644
--- a/examples/sprint-topology.cc
+++ b/examples/sprint-topology.cc
@@ -35,6 +35,13 @@
 
 NS_LOG_COMPONENT_DEFINE ("CcnxSprintTopology");
 
+void PrintTime ()
+{
+  NS_LOG_INFO (Simulator::Now ());
+
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
 int 
 main (int argc, char *argv[])
 {
@@ -42,16 +49,20 @@
   // Packet::EnablePrinting();
   string weights ("./src/NDNabstraction/examples/sprint.weights");
   string latencies ("./src/NDNabstraction/examples/sprint.latencies");
+  string positions;
     
   Time finishTime = Seconds (2.0);
   string animationFile;
   string strategy = "ns3::CcnxFloodingStrategy";
+  string save;
   CommandLine cmd;
   cmd.AddValue ("finish", "Finish time", finishTime);
   cmd.AddValue ("netanim", "NetAnim filename", animationFile);
   cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
   cmd.AddValue ("weights", "Weights file", weights);
   cmd.AddValue ("latencies", "Latencies file", latencies);
+  cmd.AddValue ("positions", "Positions files", positions);
+  cmd.AddValue ("save", "Save positions to a file", save);
   cmd.Parse (argc, argv);
 
   // ------------------------------------------------------------
@@ -61,9 +72,16 @@
   RocketfuelWeightsReader reader ("/sprint");
   reader.SetBoundingBox (0, 0, 400, 250);
 
+  if (!positions.empty())
+    {
+      reader.SetFileName (positions);
+      reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+      reader.Read ();
+    }
+  
   reader.SetFileName (weights);
   reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
-  NodeContainer nodes = reader.Read ();
+  reader.Read ();
 
   reader.SetFileName (latencies);
   reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
@@ -76,13 +94,13 @@
       return -1;
     }
     
-  NS_LOG_INFO("Nodes = " << nodes.GetN());
+  NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
   NS_LOG_INFO("Links = " << reader.LinksSize ());
     
   InternetStackHelper stack;
   Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
   stack.SetRoutingHelper (ipv4RoutingHelper);
-  stack.Install (nodes);
+  stack.Install (reader.GetNodes ());
 
   reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
 
@@ -98,14 +116,21 @@
   // ccnxHelper.InstallFakeGlobalRoutes ();
   // ccnxHelper.InstallRouteTo (Names::Find<Node> ("/sprint", "San+Jose,+CA4062"));
 
-  // Simulator::Schedule (Seconds (1.0), PrintFIBs);
-  // PrintFIBs ();
-
   Simulator::Stop (finishTime);
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+
+  // reader.SavePositions (save+".debug");
 
   NS_LOG_INFO ("Run Simulation.");
   Simulator::Run ();
   Simulator::Destroy ();
   NS_LOG_INFO ("Done.");
+
+  if (!save.empty ())
+    {
+      NS_LOG_INFO ("Saving positions.");
+      reader.SavePositions (save);
+    }
+  
   return 0;
 }
diff --git a/examples/synthetic-topology.cc b/examples/synthetic-topology.cc
index 9fe44be..971bbe1 100644
--- a/examples/synthetic-topology.cc
+++ b/examples/synthetic-topology.cc
@@ -25,13 +25,11 @@
 #include "ns3/NDNabstraction-module.h"
 #include "ns3/point-to-point-grid.h"
 #include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/animation-interface.h"
-// #include "ns3/ccnx-l3-protocol.h"
+#include "../utils/spring-mobility-helper.h"
+#include "../helper/ccnx-trace-helper.h"
 
-#include <iostream>
 #include <sstream>
 #include "ns3/annotated-topology-reader.h"
-#include "../utils/spring-mobility-helper.h"
 
 #include "ns3/config-store.h"
 
@@ -40,285 +38,122 @@
 
 NS_LOG_COMPONENT_DEFINE ("CcnxSyntheticTopology");
 
-// int transmittedInterests = 0;
-// int receivedInterests = 0;
-// int droppedInterests = 0;
-
-// int transmittedData = 0;
-// int receivedData = 0;
-// int droppedData = 0;
-
 void PrintTime ()
 {
-    NS_LOG_INFO (Simulator::Now ());
+  NS_LOG_INFO (Simulator::Now ());
     
-    Simulator::Schedule (Seconds (10.0), PrintTime);
+  Simulator::Schedule (Seconds (10.0), PrintTime);
 }
 
-void PrintFIBs ()
-{
-    NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
-    Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
-    for (NodeList::Iterator node = NodeList::Begin ();
-         node != NodeList::End ();
-         node++)
-    {
-        // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
-        
-        Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
-        NS_ASSERT_MSG (fib != 0, "Fire alarm");
-        *routingStream->GetStream () << *fib << "\n\n";
-    }
-}
-
-
-struct AggregateTrace
-{
-    AggregateTrace ()
-    : m_transmittedInterests (0)
-    , m_transmittedData (0)
-    , m_receivedInterests (0)
-    , m_receivedNacks (0)
-    , m_receivedData (0)
-    {
-    }
-    
-    void
-    TransmittedInterests (std::string context,
-                          Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>)
-    {
-        m_transmittedInterests++;
-    }
-    
-    void
-    TransmittedData (std::string context,
-                     Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                     Ptr<CcnxApp>, Ptr<CcnxFace>)
-    {
-        m_transmittedData++;
-    }
-    
-    void
-    ReceivedInterests (std::string context,
-                       Ptr<const CcnxInterestHeader>,
-                       Ptr<CcnxApp>, Ptr<CcnxFace>)
-    {
-        m_receivedInterests++;
-    }
-    
-    void
-    ReceivedNacks (std::string context,
-                   Ptr<const CcnxInterestHeader>,
-                   Ptr<CcnxApp>, Ptr<CcnxFace>)
-    {
-        m_receivedNacks++;
-    }
-    
-    void
-    ReceivedData (std::string context,
-                  Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
-                  Ptr<CcnxApp>, Ptr<CcnxFace>)
-    {
-        m_receivedData++;
-    }
-    
-    uint64_t m_transmittedInterests;
-    uint64_t m_transmittedData;
-    uint64_t m_receivedInterests;
-    uint64_t m_receivedNacks;
-    uint64_t m_receivedData;
-};
-
-ostream&
-operator << (ostream &os, const AggregateTrace &trace)
-{
-    os << ">> (i): " << trace.m_transmittedInterests << "\n";
-    os << ">> (d): " << trace.m_transmittedData << "\n";
-    os << "<< (i): " << trace.m_receivedInterests << "\n";
-    os << "<< (d): " << trace.m_receivedData << "\n";
-    os << "<< (n): " << trace.m_receivedNacks << "\n";
-    return os;
-}
-
-// static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-//                                    Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//   transmittedInterests++;
-// }
-
-// static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-//                                 Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//   receivedInterests++;
-// }
-
-// static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
-//                                Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//   droppedInterests++;
-// }
-
-// static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                                CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//     transmittedData++;    
-// }
-
-// static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                             Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-//     receivedData++;
-// }
-
-// static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-//                            CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
-// {
-//     droppedData++;
-// }
-
-int 
+int
 main (int argc, char *argv[])
 {
-    // Packet::EnableChecking();
-    // Packet::EnablePrinting();
-    string input ("./src/NDNabstraction/examples/synthetic-topology.txt");
+  string input ("./src/NDNabstraction/examples/synthetic-topology.txt");
     
-    Time finishTime = Seconds (20.0);
-    string animationFile;
-    string strategy = "ns3::CcnxFloodingStrategy";
-    CommandLine cmd;
-    cmd.AddValue ("finish", "Finish time", finishTime);
-    cmd.AddValue ("netanim", "NetAnim filename", animationFile);
-    cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
-    cmd.Parse (argc, argv);
+  Time finishTime = Seconds (20.0);
+  string strategy = "ns3::CcnxFloodingStrategy";
+  CommandLine cmd;
+  cmd.AddValue ("finish", "Finish time", finishTime);
+  cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
+  cmd.Parse (argc, argv);
     
-    ConfigStore config;
-    config.ConfigureDefaults ();
+  ConfigStore config;
+  config.ConfigureDefaults ();
     
-    // ------------------------------------------------------------
-    // -- Read topology data.
-    // --------------------------------------------
+  // ------------------------------------------------------------
+  // -- Read topology data.
+  // --------------------------------------------
     
-    AnnotatedTopologyReader reader ("/synthetic");
-    //reader.SetMobilityModel ("ns3::SpringMobilityModel");
-    reader.SetFileName (input);
+  AnnotatedTopologyReader reader ("/synthetic");
+  // reader.SetMobilityModel ("ns3::SpringMobilityModel");
+  reader.SetFileName (input);
+  NodeContainer nodes = reader.Read ();
+  // SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
     
-    NodeContainer nodes = reader.Read ();
-    
-    if (reader.LinksSize () == 0)
-    {
-        NS_LOG_ERROR ("Problems reading the topology file. Failing.");
-        return -1;
-    }
-    
-    //SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
-    
-    InternetStackHelper stack;
-    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
-    stack.SetRoutingHelper (ipv4RoutingHelper);
-    stack.Install (nodes);
-    /*
-    reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
-    */
-    NS_LOG_INFO("Nodes = " << nodes.GetN());
-    NS_LOG_INFO("Links = " << reader.LinksSize ());
-    
-    // Install CCNx stack
-    NS_LOG_INFO ("Installing CCNx stack");
-    CcnxStackHelper ccnxHelper;
-    ccnxHelper.SetForwardingStrategy (strategy);
-    ccnxHelper.EnableLimits (false, Seconds(0.1));
-    ccnxHelper.SetDefaultRoutes (true);
-    ccnxHelper.InstallAll ();
-    
-    NS_LOG_INFO ("Installing Applications");
-    CcnxConsumerHelper consumerHelper ("/5");
-    ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/synthetic", "NODE2"));
-    
-    consumers.Start (Seconds (0.0));
-    consumers.Stop (finishTime);
-    
-    CcnxConsumerHelper consumerHelper2("/6");
-    ApplicationContainer consumers2 = consumerHelper2.Install(Names::Find<Node> ("/synthetic", "NODE6"));
-    
-    consumers2.Start (Seconds (0.0));
-    consumers2.Stop (finishTime);
-    
-    CcnxProducerHelper producerHelper ("/5",1024);
-    ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/synthetic", "NODE7"));
-    
-    producers.Start (Seconds (0.0));
-    producers.Stop (finishTime);
-    
-    CcnxProducerHelper producerHelper2 ("/6",1024);
-    ApplicationContainer producers2 = producerHelper2.Install (Names::Find<Node> ("/synthetic", "NODE1"));
+  InternetStackHelper stack;
+  Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+  stack.SetRoutingHelper (ipv4RoutingHelper);
+  stack.Install (nodes);
 
-    producers2.Start (Seconds (0.0));
-    producers2.Stop (finishTime);
+  reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
 
-    // Populate FIB based on IPv4 global routing controller
-    //ccnxHelper.InstallFakeGlobalRoutes ();
-    //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE1"));
-    //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE7"));
+  NS_LOG_INFO("Nodes = " << nodes.GetN());
+  NS_LOG_INFO("Links = " << reader.LinksSize ());
     
-    Simulator::Schedule (Seconds (1.0), PrintFIBs);
-    PrintFIBs ();
+  // Install CCNx stack
+  NS_LOG_INFO ("Installing CCNx stack");
+  CcnxStackHelper ccnxHelper;
+  ccnxHelper.SetForwardingStrategy (strategy);
+  ccnxHelper.EnableLimits (true, Seconds(0.1));
+  ccnxHelper.SetDefaultRoutes (false);
+  ccnxHelper.InstallAll ();
     
-    Simulator::Schedule (Seconds (10.0), PrintTime);
-    
-    Simulator::Stop (finishTime);
-    
-    AnimationInterface *anim = 0;
-    if (animationFile != "")
-    {
-        anim = new AnimationInterface (animationFile);
-        anim->SetMobilityPollInterval (Seconds (1));
-    }
-    
-    // NS_LOG_INFO ("Configure Tracing.");
-    AggregateTrace trace;
-    Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/TransmittedInterests",
-                     MakeCallback (&AggregateTrace::TransmittedInterests, &trace));
-    
-    Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedNacks",
-                     MakeCallback (&AggregateTrace::ReceivedNacks, &trace));
-    
-    Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/ReceivedInterests",
-                     MakeCallback (&AggregateTrace::ReceivedInterests, &trace));
-    
-    Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/TransmittedContentObjects",
-                     MakeCallback (&AggregateTrace::TransmittedData, &trace));
-    
-    Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedContentObjects",
-                     MakeCallback (&AggregateTrace::ReceivedData, &trace));
-    
-    // Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
-    //                                MakeCallback (&OnTransmittedInterest));
-    // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
-    //                    MakeCallback (&OnReceivedInterest));
-    // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
-    //                    MakeCallback (&OnDroppedInterest));
-    
-    // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
-    //                    MakeCallback (&OnReceivedData));
-    // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
-    //                    MakeCallback (&OnTransmittedData));
-    // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
-    //                    MakeCallback (&OnDroppedData));
-    
-    config.ConfigureAttributes ();  
-    
-    NS_LOG_INFO ("Run Simulation.");
-    Simulator::Run ();
-    Simulator::Destroy ();
-    NS_LOG_INFO ("Done.");
-    
-    // NS_LOG_INFO("Total received interests = " << receivedInterests);
-    // NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
-    // NS_LOG_INFO("Total dropped interests = " << droppedInterests);
-    // NS_LOG_INFO("Total received data = " << receivedData);
-    // NS_LOG_INFO("Total transmitted data = " << transmittedData);
-    // NS_LOG_INFO("Total dropped data = " << droppedData);
-    NS_LOG_INFO (trace);
-    return 0;
+  NS_LOG_INFO ("Installing Applications");
+  CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+
+  consumerHelper.SetPrefix ("/6");
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+  consumerHelper.SetAttribute ("Size", StringValue ("1.0"));
+  ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/synthetic", "c1"));
+
+  consumerHelper.SetPrefix ("/7");
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+  ApplicationContainer consumers2 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c2"));
+
+  consumerHelper.SetPrefix ("/8");
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+  ApplicationContainer consumers3 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c3"));
+  
+  consumerHelper.SetPrefix ("/10");
+  consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+  ApplicationContainer consumers4 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c4"));
+
+  consumers.Start (Seconds (0));
+  consumers2.Start (Seconds (2.5));
+  consumers3.Start (Seconds (5));
+  consumers4.Start (Seconds (7.5));
+
+  /////////////////////////////////////////////
+  
+  CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
+ 
+  producerHelper.SetPrefix ("/6");  
+  producerHelper.Install (Names::Find<Node> ("/synthetic", "p1"));
+        
+  producerHelper.SetPrefix ("/7");
+  producerHelper.Install (Names::Find<Node> ("/synthetic", "p2"));
+
+  producerHelper.SetPrefix ("/8");
+  producerHelper.Install (Names::Find<Node> ("/synthetic", "p3"));
+  
+  producerHelper.SetPrefix ("/10");
+  producerHelper.Install (Names::Find<Node> ("/synthetic", "p4"));
+
+  // Populate FIB based on IPv4 global routing controller
+  ccnxHelper.InstallFakeGlobalRoutes ();
+  ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p1"));
+  ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p2"));
+  ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p3"));
+  ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p4"));
+
+  Simulator::Schedule (Seconds (10.0), PrintTime);
+
+  Simulator::Stop (finishTime);
+
+  CcnxTraceHelper traceHelper;
+  // traceHelper.EnableAggregateAppAll ("ns3::CcnxConsumer");
+  // traceHelper.EnableAggregateAppAll ("ns3::CcnxProducer");
+  // traceHelper.EnableAggregateL3All ();
+  // traceHelper.SetL3TraceFile ("trace-l3.log");
+  // traceHelper.SetAppTraceFile ("trace-app.log");
+  // traceHelper.EnableRateL3All ("rate-trace.log");
+  traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", "consumers-seqs.log");
+
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done.");
+
+  return 0;
 }
diff --git a/examples/synthetic-topology.txt b/examples/synthetic-topology.txt
index a1bf8f7..260f6ab 100644
--- a/examples/synthetic-topology.txt
+++ b/examples/synthetic-topology.txt
@@ -1,20 +1,29 @@
 router
 #name	city	latitude	longitude
-NODE1	NODE1	60  20
-NODE2	NODE2	20	20
-NODE3	NODE3	40	40
-NODE4	NODE4	20	60
-NODE5	NODE5	40	80
-NODE6	NODE6	60  100
-NODE7	NODE7	20	100
+c1	NODE1	50		30
+c2	NODE2	30		30
+c3	x	10		30
+n1	NODE3	40		40
+n12	NODE4	30		60
+n2	NODE5	40		80
+p1	NODE6	50  		90
+p2	NODE7	30		90
+p3	x	10		90
+c4	x	10		40
+p4	x	10		80
 link
 #capacity on 4/10/2003 (see page 20 of http://www.internet2.edu/presentations/spring03/20030410-Abilene-Corbato.pdf)
 #OSPF weight on 04/10/2003 (see http://www.abilene.iu.edu/images/Ab-IGP-topo.jpg)
-#x	y	capacity(kbps)	OSPF    Delay   QueueSize1  QueueSize2
-NODE1	NODE3	10000 1 1   80  120
-NODE2	NODE3	10000 1 1   110 150
-NODE3	NODE4	1000 1176   1   40  30
-NODE3	NODE5	1000 587 1  50  55  50
-NODE4	NODE5	1000 846    1   10  20
-NODE5	NODE6	10000 260   1   15  35
-NODE5	NODE7	10000 700   50  25  45
+#x	y	capacity(kbps)	OSPF    Delay		MaxPackets
+c1	n1	10Mbps 		1 	50ms  		200
+c2	n1	10Mbps 		1 	10ms   		200
+c3	n1	10Mbps		1	100ms		200
+n1	n2	1Mbps 		1176   	20ms   		20 
+n1	n12	1Mbps 		587    	1ms   		20
+n12	n2	1Mbps 		846    	1ms   		20
+n2	p1	10Mbps 		260   	1ms   		200
+n2	p2	10Mbps 		700   	1ms  		200
+n2	p3	10Mbps		1	1ms		200
+c4	n1	10Mbps		1	1ms		200
+n2	p4	10Mbps		1	1ms		200
+
diff --git a/examples/wscript b/examples/wscript
deleted file mode 100644
index 0d2e449..0000000
--- a/examples/wscript
+++ /dev/null
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if not bld.env['ENABLE_EXAMPLES']:
-        return;
-    
-    # obj = bld.create_ns3_program('stupid-interest-generator', ['NDNabstraction'])
-    # obj.source = 'stupid-interest-generator.cc'
diff --git a/helper/ccnx-consumer-helper.cc b/helper/ccnx-app-helper.cc
similarity index 64%
rename from helper/ccnx-consumer-helper.cc
rename to helper/ccnx-app-helper.cc
index d41de22..d52a005 100644
--- a/helper/ccnx-consumer-helper.cc
+++ b/helper/ccnx-app-helper.cc
@@ -18,47 +18,49 @@
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#include "ccnx-consumer-helper.h"
+#include "ccnx-app-helper.h"
 #include "ns3/log.h"
-#include "ns3/ccnx-name-components.h"
+#include "ns3/string.h"
 #include "ns3/names.h"
-#include "../apps/ccnx-consumer.h"
+#include "ns3/ccnx-app.h"
 
-NS_LOG_COMPONENT_DEFINE ("CcnxConsumerHelper");
+NS_LOG_COMPONENT_DEFINE ("CcnxAppHelper");
 
 namespace ns3 
 {
-    
-CcnxConsumerHelper::CcnxConsumerHelper (const std::string &prefix)
+
+CcnxAppHelper::CcnxAppHelper (const std::string &app)
 {
-  m_factory.SetTypeId ("ns3::CcnxConsumer");
-    
-  CcnxNameComponentsValue prefixValue;
-  prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
-  m_factory.Set ("InterestName", prefixValue);
+  m_factory.SetTypeId (app);
 }
-    
+
+void
+CcnxAppHelper::SetPrefix (const std::string &prefix)
+{
+  m_factory.Set ("Prefix", StringValue(prefix));
+}
+
 void 
-CcnxConsumerHelper::SetAttribute (std::string name, const AttributeValue &value)
+CcnxAppHelper::SetAttribute (std::string name, const AttributeValue &value)
 {
   m_factory.Set (name, value);
 }
     
 ApplicationContainer
-CcnxConsumerHelper::Install (Ptr<Node> node)
+CcnxAppHelper::Install (Ptr<Node> node)
 {
   return ApplicationContainer (InstallPriv (node));
 }
     
 ApplicationContainer
-CcnxConsumerHelper::Install (std::string nodeName)
+CcnxAppHelper::Install (std::string nodeName)
 {
   Ptr<Node> node = Names::Find<Node> (nodeName);
   return ApplicationContainer (InstallPriv (node));
 }
     
 ApplicationContainer
-CcnxConsumerHelper::Install (NodeContainer c)
+CcnxAppHelper::Install (NodeContainer c)
 {
   ApplicationContainer apps;
   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
@@ -70,11 +72,12 @@
 }
     
 Ptr<Application>
-CcnxConsumerHelper::InstallPriv (Ptr<Node> node)
+CcnxAppHelper::InstallPriv (Ptr<Node> node)
 {
-  Ptr<CcnxConsumer> app = m_factory.Create<CcnxConsumer> ();        
+  Ptr<CcnxApp> app = m_factory.Create<CcnxApp> ();        
   node->AddApplication (app);
         
   return app;
 }
+
 }
diff --git a/helper/ccnx-consumer-helper.h b/helper/ccnx-app-helper.h
similarity index 87%
rename from helper/ccnx-consumer-helper.h
rename to helper/ccnx-app-helper.h
index 158ede7..3eb1296 100644
--- a/helper/ccnx-consumer-helper.h
+++ b/helper/ccnx-app-helper.h
@@ -18,8 +18,8 @@
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#ifndef CCNX_CONSUMER_HELPER_H
-#define CCNX_CONSUMER_HELPER_H
+#ifndef CCNX_APP_HELPER_H
+#define CCNX_APP_HELPER_H
 
 #include "ns3/object-factory.h"
 #include "ns3/attribute.h"
@@ -28,23 +28,29 @@
 #include "ns3/ptr.h"
 
 namespace ns3 
-{    
+{
+
 /**
  * \brief A helper to make it easier to instantiate an ns3::CcnxConsumer Application
  * on a set of nodes.
  */
-    
-class CcnxConsumerHelper
+class CcnxAppHelper
 {        
 public:
 
   /**
-   * \brief Create an CcnxConsumerHelper to make it easier to work with CcnxConsumer Apps
+   * \brief Create an CcnxAppHelper to make it easier to work with CCNx apps
    *
-   * \param prefix Prefix which will be requested by the consumer applications
+   * \param app Class of the application
    */
-  CcnxConsumerHelper (const std::string &prefix);
-        
+  CcnxAppHelper (const std::string &prefix);
+
+  /**
+   * @brief Set the prefix consumer will be requesting
+   */
+  void
+  SetPrefix (const std::string &prefix);
+  
   /**
    * \brief Helper function used to set the underlying application attributes.
    *
@@ -94,7 +100,7 @@
   ObjectFactory m_factory;
 };
 
-}
+} // namespace ns3
 
-#endif
+#endif // CCNX_APP_HELPER_H
 
diff --git a/helper/ccnx-producer-helper.cc b/helper/ccnx-producer-helper.cc
deleted file mode 100644
index ec44aca..0000000
--- a/helper/ccnx-producer-helper.cc
+++ /dev/null
@@ -1,85 +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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccnx-producer-helper.h"
-#include "ns3/log.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/uinteger.h"
-#include "ns3/names.h"
-#include "../apps/ccnx-producer.h"
-
-NS_LOG_COMPONENT_DEFINE ("CcnxProducerHelper");
-
-namespace ns3 
-{
-    
-CcnxProducerHelper::CcnxProducerHelper (const std::string &prefix, uint32_t virtualPayloadSize)
-{
-  m_factory.SetTypeId ("ns3::CcnxProducer");
-    
-  CcnxNameComponentsValue prefixValue;
-  prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
-  m_factory.Set ("Prefix", prefixValue);
-    
-  m_factory.Set ("PayloadSize", UintegerValue (virtualPayloadSize));
-}
-    
-void 
-CcnxProducerHelper::SetAttribute (std::string name, const AttributeValue &value)
-{
-  m_factory.Set (name, value);
-}
-    
-ApplicationContainer
-CcnxProducerHelper::Install (Ptr<Node> node)
-{
-  NS_LOG_FUNCTION(this);
-  return ApplicationContainer (InstallPriv (node));
-}
-
-ApplicationContainer
-CcnxProducerHelper::Install (std::string nodeName)
-{
-  Ptr<Node> node = Names::Find<Node> (nodeName);
-  return ApplicationContainer (InstallPriv (node));
-}
-    
-ApplicationContainer
-CcnxProducerHelper::Install (NodeContainer c)
-{
-  ApplicationContainer apps;
-  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
-    {
-      apps.Add (InstallPriv (*i));
-    }
-        
-  return apps;
-}
-
-Ptr<Application>
-CcnxProducerHelper::InstallPriv (Ptr<Node> node)
-{
-  NS_LOG_INFO ("InstallPriv started");
-  Ptr<CcnxProducer> app = m_factory.Create<CcnxProducer> ();        
-  node->AddApplication (app);
-        
-  return app;
-}
-}
diff --git a/helper/ccnx-producer-helper.h b/helper/ccnx-producer-helper.h
deleted file mode 100644
index eaa3665..0000000
--- a/helper/ccnx-producer-helper.h
+++ /dev/null
@@ -1,99 +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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef CCNX_PRODUCER_HELPER_H
-#define CCNX_PRODUCER_HELPER_H
-
-#include "ns3/object-factory.h"
-#include "ns3/attribute.h"
-#include "ns3/node-container.h"
-#include "ns3/application-container.h"
-#include "ns3/ptr.h"
-
-namespace ns3 
-{    
-/**
-* \brief A helper to make it easier to instantiate an ns3::CcnxProducer application
-* on a set of nodes.
-*/
-
-class Node;
-
-class CcnxProducerHelper
-{
-public:
-  /**
-   * Create an CcnxProducerHelper to make it easier to work with CcnxProducer applications
-   *
-   */
-  CcnxProducerHelper (const std::string &prefix, uint32_t virtualPayloadSize);
-        
-  /**
-   * Helper function used to set the underlying application attributes.
-   *
-   * \param name the name of the application attribute to set
-   * \param value the value of the application attribute to set
-   */
-  void SetAttribute (std::string name, const AttributeValue &value);
-        
-  /**
-   * Install an ns3::CcnxProducer on each node of the input container
-   * configured with all the attributes set with SetAttribute.
-   *
-   * \param c NodeContainer of the set of nodes on which an CcnxProducer 
-   * will be installed.
-   * \returns Container of Ptr to the applications installed.
-   */
-  ApplicationContainer Install (NodeContainer c);
-        
-  /**
-   * Install an ns3::CcnxProducer on the node configured with all the 
-   * attributes set with SetAttribute.
-   *
-   * \param node The node on which an CcnxProducer will be installed.
-   * \returns Container of Ptr to the applications installed.
-   */
-  ApplicationContainer Install (Ptr<Node> node);
-        
-  /**
-   * Install an ns3::CcnxProducer on the node configured with all the 
-   * attributes set with SetAttribute.
-   *
-   * \param nodeName The node on which an CcnxProducer will be installed.
-   * \returns Container of Ptr to the applications installed.
-   */
-  ApplicationContainer Install (std::string nodeName);
-        
-private:
-  /**
-   * \internal
-   * Install an ns3::CcnxProducer on the node configured with all the 
-   * attributes set with SetAttribute.
-   *
-   * \param node The node on which an CcnxProducer will be installed.
-   * \returns Ptr to the application installed.
-   */
-  Ptr<Application> InstallPriv (Ptr<Node> node);
-  ObjectFactory m_factory;
-};
-}
-
-#endif
-
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index 9699c38..ff73cae 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -159,9 +159,9 @@
 {
   NS_LOG_INFO ("EnableLimits: " << enable);
   m_limitsEnabled = enable;
+  m_avgRtt = avgRtt;
   m_avgContentObjectSize = avgContentObject;
   m_avgInterestSize = avgInterest;
-  m_avgRtt = avgRtt;
 }
 
 Ptr<CcnxFaceContainer>
@@ -200,8 +200,7 @@
   Ptr<CcnxL3Protocol> ccnx = CreateObject<CcnxL3Protocol> ();
   node->AggregateObject (ccnx);
 
-  ccnx->SetForwardingStrategy
-    (DynamicCast<CcnxForwardingStrategy> (m_strategyFactory.Create<Object> ()));
+  ccnx->SetForwardingStrategy (m_strategyFactory.Create<CcnxForwardingStrategy> ());
   
   for (uint32_t index=0; index < node->GetNDevices (); index++)
     {
@@ -239,7 +238,8 @@
           NS_LOG_INFO("DataRate for this link is " << dataRate.Get());
 
           double maxInterestPackets = 1.0  * dataRate.Get ().GetBitRate () / 8.0 / m_avgContentObjectSize;
-          NS_LOG_INFO ("BucketMax: " << maxInterestPackets);
+          NS_LOG_INFO ("Max packets per second: " << maxInterestPackets);
+          NS_LOG_INFO ("Max burst: " << m_avgRtt.ToDouble (Time::S) * maxInterestPackets);
 
           // Set bucket max to BDP
           face->SetBucketMax (m_avgRtt.ToDouble (Time::S) * maxInterestPackets); // number of interests allowed
@@ -559,7 +559,7 @@
 // }
 
 void
-CcnxStackHelper::InstallFakeGlobalRoutes ()
+CcnxStackHelper::InstallFakeGlobalRoutesImpl ()
 {
   for (NodeList::Iterator node = NodeList::Begin ();
        node != NodeList::End ();
@@ -584,7 +584,12 @@
 
       globalRouter->InjectRoute (Ipv4Address((*node)->GetId ()), Ipv4Mask("255.255.255.255"));
     }
+}
 
+void
+CcnxStackHelper::InstallFakeGlobalRoutes ()
+{
+  InstallFakeGlobalRoutesImpl ();
   Ipv4GlobalRoutingHelper::PopulateAllPossibleRoutingTables ();
 }
 
diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
index f52c0d3..b4cdbc6 100644
--- a/helper/ccnx-stack-helper.h
+++ b/helper/ccnx-stack-helper.h
@@ -180,6 +180,9 @@
   void
   InstallFakeGlobalRoutes ();
 
+  void
+  InstallFakeGlobalRoutesImpl ();
+  
   /**
    * \brief Installs CCNx route to `node` based on fake IPv4 routes
    *
diff --git a/helper/ccnx-trace-helper.cc b/helper/ccnx-trace-helper.cc
new file mode 100644
index 0000000..1742462
--- /dev/null
+++ b/helper/ccnx-trace-helper.cc
@@ -0,0 +1,290 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-trace-helper.h"
+
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/packet.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/node-list.h"
+#include "ns3/object-vector.h"
+#include "ns3/simulator.h"
+#include "ns3/names.h"
+
+#include <boost/ref.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "tracers/ccnx-aggregate-app-tracer.h"
+#include "tracers/ccnx-aggregate-l3-tracer.h"
+#include "tracers/ccnx-rate-l3-tracer.h"
+#include "tracers/ccnx-seqs-app-tracer.h"
+#include "tracers/ipv4-seqs-app-tracer.h"
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+#include <fstream>
+
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("CcnxTraceHelper");
+
+namespace ns3 {
+
+CcnxTraceHelper::CcnxTraceHelper ()
+  : m_l3RateTrace (0)
+  , m_appSeqsTrace (0)
+  , m_ipv4AppSeqsTrace (0)
+{
+}
+
+CcnxTraceHelper::~CcnxTraceHelper ()
+{
+  NS_LOG_FUNCTION (this);
+  if (m_l3RateTrace != 0) delete m_l3RateTrace;
+  if (m_appSeqsTrace != 0) delete m_appSeqsTrace;
+  if (m_ipv4AppSeqsTrace != 0) delete m_ipv4AppSeqsTrace;
+  
+  if (m_apps.size () > 0)
+    {
+      ofstream of;
+      if (!m_appTrace.empty ())
+        {
+          of.open (m_appTrace.c_str (), ios_base::trunc | ios_base::out);
+          of << "# ";
+          m_apps.front ()->PrintHeader (of);
+          of << "\n";
+        }
+      
+      for (std::list<Ptr<CcnxAppTracer> >::iterator app = m_apps.begin ();
+           app != m_apps.end ();
+           app++)
+        {
+          if (!m_appTrace.empty ())
+            {
+              (*app)->Print (of);
+              of << "\n";
+            }
+          else
+            {
+              NS_LOG_INFO (*(*app));
+            }
+        }
+    }
+
+  if (m_l3s.size () > 0)
+    {
+      ofstream of;
+      if (!m_l3Trace.empty ())
+        {
+          of.open (m_l3Trace.c_str (), ios_base::trunc | ios_base::out);
+          of << "# ";
+          m_l3s.front ()->PrintHeader (of);
+          of << "\n";
+        }
+      
+      for (std::list<Ptr<CcnxL3Tracer> >::iterator l3 = m_l3s.begin ();
+           l3 != m_l3s.end ();
+           l3++)
+        {
+          if (!m_l3Trace.empty ())
+            {
+              (*l3)->Print (of);
+              of << "\n";
+            }
+          else
+            {
+              NS_LOG_INFO (*(*l3));
+            }
+        }
+    }
+}
+
+void
+CcnxTraceHelper::SetAppTraceFile (const std::string &appTrace)
+{
+  NS_LOG_FUNCTION (this << appTrace);
+  m_appTrace = appTrace;
+}
+
+void
+CcnxTraceHelper::SetL3TraceFile (const std::string &l3Trace)
+{
+  NS_LOG_FUNCTION (this << l3Trace);
+  m_l3Trace = l3Trace;
+}
+
+void
+CcnxTraceHelper::EnableAggregateAppAll (const std::string &appName)
+{
+  NS_LOG_FUNCTION (this << appName);
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      ObjectVectorValue apps;
+      (*node)->GetAttribute ("ApplicationList", apps);
+
+      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+      
+      uint32_t appId = 0;
+      for (ObjectVectorValue::Iterator app = apps.Begin ();
+           app != apps.End ();
+           app++, appId++)
+        {
+          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+          if ((*app)->GetInstanceTypeId ().GetName () == appName)
+            {
+              m_apps.push_back (Create<CcnxAggregateAppTracer> (appName,
+                                                                *node,
+                                                                lexical_cast<string> (appId)));
+            }
+        }
+    }
+}
+
+void
+CcnxTraceHelper::EnableAggregateL3All ()
+{
+  NS_LOG_FUNCTION (this);
+  
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+      
+      m_l3s.push_back (Create<CcnxAggregateL3Tracer> (*node));
+    }
+}
+
+void
+CcnxTraceHelper::EnableRateL3All (const std::string &l3RateTrace)
+{
+  NS_LOG_FUNCTION (this);
+  m_l3RateTrace = new ofstream (l3RateTrace.c_str (), ios::trunc);
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+      Ptr<CcnxRateL3Tracer> trace = Create<CcnxRateL3Tracer> (boost::ref(*m_l3RateTrace), *node);
+      trace->SetAveragingPeriod (Seconds (0.5));
+      m_l3Rates.push_back (trace);
+    }
+
+  if (m_l3Rates.size () > 0)
+    {
+      // *m_l3RateTrace << "# "; // not necessary for R's read.table
+      m_l3Rates.front ()->PrintHeader (*m_l3RateTrace);
+      *m_l3RateTrace << "\n";
+    }
+}
+
+void
+CcnxTraceHelper::EnableSeqsAppAll (const std::string &appName, const std::string &trace)
+{
+  NS_LOG_FUNCTION (this);
+  m_appSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      ObjectVectorValue apps;
+      (*node)->GetAttribute ("ApplicationList", apps);
+
+      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+      
+      uint32_t appId = 0;
+      for (ObjectVectorValue::Iterator app = apps.Begin ();
+           app != apps.End ();
+           app++, appId++)
+        {
+          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+          if ((*app)->GetInstanceTypeId ().GetName () == appName)
+            {
+              Ptr<CcnxSeqsAppTracer> trace = Create<CcnxSeqsAppTracer> (boost::ref(*m_appSeqsTrace),
+                                                                        appName,
+                                                                        *node,
+                                                                        lexical_cast<string> (appId));
+              m_appSeqs.push_back (trace);
+            }
+        }
+      
+    }
+
+  if (m_appSeqs.size () > 0)
+    {
+      // *m_l3RateTrace << "# "; // not necessary for R's read.table
+      m_appSeqs.front ()->PrintHeader (*m_appSeqsTrace);
+      *m_appSeqsTrace << "\n";
+    }
+}
+
+void
+CcnxTraceHelper::EnableIpv4SeqsAppAll (const std::string &trace)
+{
+  NS_LOG_FUNCTION (this);
+  m_ipv4AppSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      ObjectVectorValue apps;
+      (*node)->GetAttribute ("ApplicationList", apps);
+
+      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+      
+      uint32_t appId = 0;
+      for (ObjectVectorValue::Iterator app = apps.Begin ();
+           app != apps.End ();
+           app++, appId++)
+        {
+          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+          if ((*app)->GetInstanceTypeId ().GetName () == "ns3::PacketSink" ||
+              (*app)->GetInstanceTypeId ().GetName () == "ns3::BulkSendApplication")
+            {
+              Ptr<Ipv4SeqsAppTracer> trace = Create<Ipv4SeqsAppTracer> (boost::ref(*m_ipv4AppSeqsTrace),
+                                                                        *node,
+                                                                        lexical_cast<string> (appId));
+              m_ipv4AppSeqs.push_back (trace);
+            }
+        }
+      
+    }
+
+  if (m_ipv4AppSeqs.size () > 0)
+    {
+      m_ipv4AppSeqs.front ()->PrintHeader (*m_ipv4AppSeqsTrace);
+      *m_ipv4AppSeqsTrace << "\n";
+    }
+}
+
+
+} // namespace ns3
diff --git a/helper/ccnx-trace-helper.h b/helper/ccnx-trace-helper.h
new file mode 100644
index 0000000..4079f9c
--- /dev/null
+++ b/helper/ccnx-trace-helper.h
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_TRACE_HELPER_H
+#define CCNX_TRACE_HELPER_H
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+
+#include <list>
+
+namespace ns3 {
+
+class CcnxAppTracer;
+class CcnxL3Tracer;
+class Ipv4AppTracer;
+
+class CcnxTraceHelper
+{
+public:
+  CcnxTraceHelper ();
+  
+  /**
+   * @brief Destructor that invokes trace output procedures
+   */
+  ~CcnxTraceHelper ();
+
+  /**
+   * @brief Set filename to output app trace.
+   *
+   * By default, trace is output to NS_LOG_INFO stream
+   *
+   * @param file File where trace will be written to
+   */
+  void
+  SetAppTraceFile (const std::string &appTrace = "apps.log");
+
+  /**
+   * @brief Set filename to output app trace.
+   *
+   * By default, trace is output to NS_LOG_INFO stream
+   *
+   * @param file File where trace will be written to
+   */
+  void
+  SetL3TraceFile (const std::string &l3Trace = "l3.log");
+
+  /**
+   * @brief Enable aggregate app-level CCNx tracing on all CCNx applications
+   *
+   * @param app  Class name of the application of interest
+   */
+  void
+  EnableAggregateAppAll (const std::string &app);
+
+  /**
+   * @brief Enable aggregate network-level CCNx tracing on all CCNx node
+   */
+  void
+  EnableAggregateL3All ();
+
+  /**
+   * @brief Enable network-level CCNx rate tracing on all CCNx nodes
+   */
+  void
+  EnableRateL3All (const std::string &l3RateTrace = "l3-rate.log");
+  
+  /**
+   * @brief Enable app-level CCNx sequence tracing on all CCNx applications
+   */
+  void
+  EnableSeqsAppAll (const std::string &app, const std::string &appSeqsTrace = "app-seqs.log");
+
+  /**
+   * @brief Enable app-level IPv4 sequence tracing on all nodes (BulkSender + PacketSink)
+   */
+  void
+  EnableIpv4SeqsAppAll (const std::string &appSeqsTrace = "app-seqs.log");
+  
+private:
+  std::string m_appTrace;
+  std::list<Ptr<CcnxAppTracer> > m_apps;
+
+  std::string m_l3Trace;
+  std::list<Ptr<CcnxL3Tracer> > m_l3s;
+
+  std::list<Ptr<CcnxL3Tracer> > m_l3Rates;
+  std::ostream *m_l3RateTrace;
+
+  std::list<Ptr<CcnxAppTracer> > m_appSeqs;
+  std::ostream *m_appSeqsTrace;
+
+  std::list<Ptr<Ipv4AppTracer> > m_ipv4AppSeqs;
+  std::ostream *m_ipv4AppSeqsTrace;
+};
+
+
+} // namespace ns3
+
+#endif /* CCNX_TRACE_HELPER_H */
diff --git a/helper/tracers/ccnx-aggregate-app-tracer.cc b/helper/tracers/ccnx-aggregate-app-tracer.cc
new file mode 100644
index 0000000..6129e8c
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-app-tracer.cc
@@ -0,0 +1,172 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-aggregate-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+    
+CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
+  : CcnxAppTracer (app, node, appId)
+  , m_inInterests (0)
+  , m_outInterests (0)
+  , m_inNacks (0)
+  , m_inData (0)
+  , m_outData (0)
+
+  , m_inInterestsBytes (0)
+  , m_outInterestsBytes (0)
+  , m_inNacksBytes (0)
+  , m_inDataBytes (0)
+  , m_outDataBytes (0)
+{
+}
+
+CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId)
+  : CcnxAppTracer (app, node, appId)
+  , m_inInterests (0)
+  , m_outInterests (0)
+  , m_inNacks (0)
+  , m_inData (0)
+  , m_outData (0)
+
+  , m_inInterestsBytes (0)
+  , m_outInterestsBytes (0)
+  , m_inNacksBytes (0)
+  , m_inDataBytes (0)
+  , m_outDataBytes (0)
+{
+}
+
+void
+CcnxAggregateAppTracer::Reset ()
+{
+  m_inInterests = 0;
+  m_outInterests = 0;
+  m_inNacks = 0;
+  m_inData = 0;
+  m_outData = 0;
+
+  m_inInterestsBytes = 0;
+  m_outInterestsBytes = 0;
+  m_inNacksBytes = 0;
+  m_inDataBytes = 0;
+  m_outDataBytes = 0;
+}
+
+void
+CcnxAggregateAppTracer::PrintHeader (std::ostream &os) const
+{
+  os << "NodeId" << "\t"
+     << "App" << "\t"
+     << "AppId" << "\t"
+     << "InInterests" << "\t"
+     << "OutInterests" << "\t"
+    
+     << "InNacks" << "\t"
+    
+     << "InData" << "\t"
+     << "OutData" << "\t"
+
+     << "InInterestsBytes" << "\t"
+     << "OutInterestsBytes" << "\t"
+    
+     << "InNacksBytes" << "\t"
+    
+     << "InDataBytes" << "\t"
+     << "OutDataBytes";
+}
+
+void
+CcnxAggregateAppTracer::Print (std::ostream &os) const
+{
+  os << m_node << "\t"
+     << m_app << "\t"
+     << m_appId << "\t"
+
+     << m_inInterests << "\t"
+     << m_outInterests << "\t"
+    
+     << m_inNacks << "\t"
+    
+     << m_inData << "\t"
+     << m_outData << "\t"
+
+     << m_inInterestsBytes << "\t"
+     << m_outInterestsBytes << "\t"
+    
+     << m_inNacksBytes << "\t"
+    
+     << m_inDataBytes << "\t"
+     << m_outDataBytes;
+}
+
+void
+CcnxAggregateAppTracer::OutInterests (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  m_outInterests++;
+  m_outInterestsBytes += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::OutData (std::string context,
+                                 Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                                 Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  m_outData++;
+  m_outDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::InInterests (std::string context,
+                                     Ptr<const CcnxInterestHeader> header,
+                                     Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  m_inInterests++;
+  m_inInterestsBytes += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::InNacks (std::string context,
+                                 Ptr<const CcnxInterestHeader> header,
+                                 Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  m_inNacks++;
+  m_inNacksBytes += header->GetSerializedSize ();
+}
+  
+void
+CcnxAggregateAppTracer::InData (std::string context,
+                                Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                                Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  m_inData++;
+  m_inDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-aggregate-app-tracer.h b/helper/tracers/ccnx-aggregate-app-tracer.h
new file mode 100644
index 0000000..e321b64
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-app-tracer.h
@@ -0,0 +1,81 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_AGGREGATE_APP_TRACER_H
+#define CCNX_AGGREGATE_APP_TRACER_H
+
+#include "ns3/ccnx-app-tracer.h"
+
+namespace ns3 {
+
+class CcnxAggregateAppTracer : public CcnxAppTracer
+{
+public:
+  CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+  CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
+  virtual ~CcnxAggregateAppTracer () { };
+
+  virtual void
+  PrintHeader (std::ostream &os) const;
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual void
+  OutInterests (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  InInterests  (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  InNacks (std::string context,
+           Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  OutData (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+  
+  virtual void
+  InData  (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+protected:
+  void
+  Reset ();
+
+protected:
+  uint64_t m_inInterests;
+  uint64_t m_outInterests;
+  uint64_t m_inNacks;
+  uint64_t m_inData; 
+  uint64_t m_outData;
+
+  uint64_t m_inInterestsBytes;
+  uint64_t m_outInterestsBytes;
+  uint64_t m_inNacksBytes;
+  uint64_t m_inDataBytes;
+  uint64_t m_outDataBytes;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/helper/tracers/ccnx-aggregate-l3-tracer.cc b/helper/tracers/ccnx-aggregate-l3-tracer.cc
new file mode 100644
index 0000000..596f036
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-l3-tracer.cc
@@ -0,0 +1,201 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-aggregate-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+    
+CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (Ptr<Node> node)
+  : CcnxL3Tracer (node)
+{
+  Reset ();
+}
+
+CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (const std::string &node)
+  : CcnxL3Tracer (node)
+{
+  Reset ();
+}
+
+void
+CcnxAggregateL3Tracer::Stats::Reset ()
+{
+  m_inInterests = 0;
+  m_outInterests = 0;
+  m_dropInterests = 0;
+  m_inNacks = 0;
+  m_outNacks = 0;
+  m_dropNacks = 0;
+  m_inData = 0;
+  m_outData = 0;
+  m_dropData = 0;
+}
+
+
+void
+CcnxAggregateL3Tracer::Reset ()
+{
+  m_packets.Reset ();
+  m_bytes.Reset ();
+}
+
+
+void
+CcnxAggregateL3Tracer::PrintHeader (std::ostream &os) const
+{
+  os << "Node" << "\t"
+     << "InInterests" << "\t"
+     << "OutInterests" << "\t"
+     << "DropInterests" << "\t"
+    
+     << "InNacks" << "\t"
+     << "OutNacks" << "\t"
+     << "DropNacks" << "\t"
+    
+     << "InData" << "\t"
+     << "OutData" << "\t"
+     << "DropData" << "\t"
+    
+     << "InInterestsBytes" << "\t"
+     << "OutInterestsBytes" << "\t"
+     << "DropInterestsBytes" << "\t"
+    
+     << "InNacksBytes" << "\t"
+     << "OutNacksBytes" << "\t"
+     << "DropNacksBytes" << "\t"
+    
+     << "InDataBytes" << "\t"
+     << "OutDataBytes" << "\t"
+     << "DropDataBytes";
+}
+
+void
+CcnxAggregateL3Tracer::Print (std::ostream &os) const
+{
+  os << m_node << "\t"
+     << m_packets.m_inInterests   << "\t"
+     << m_packets.m_outInterests  << "\t"
+     << m_packets.m_dropInterests << "\t"
+
+     << m_packets.m_inNacks   << "\t"
+     << m_packets.m_outNacks  << "\t"
+     << m_packets.m_dropNacks << "\t"
+
+     << m_packets.m_inData   << "\t"
+     << m_packets.m_outData  << "\t"
+     << m_packets.m_dropData << "\t"
+
+     << m_bytes.m_inInterests   << "\t"
+     << m_bytes.m_outInterests  << "\t"
+     << m_bytes.m_dropInterests << "\t"
+
+     << m_bytes.m_inNacks   << "\t"
+     << m_bytes.m_outNacks  << "\t"
+     << m_bytes.m_dropNacks << "\t"
+
+     << m_bytes.m_inData   << "\t"
+     << m_bytes.m_outData  << "\t"
+     << m_bytes.m_dropData;
+}
+
+void
+CcnxAggregateL3Tracer::OutInterests  (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+  m_packets.m_outInterests++;
+  m_bytes.m_outInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InInterests   (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+  m_packets.m_inInterests++;
+  m_bytes.m_inInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropInterests (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+  m_packets.m_dropInterests++;
+  m_bytes.m_dropInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::OutNacks  (std::string context,
+                                  Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+  m_packets.m_outNacks++;
+  m_bytes.m_outNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InNacks   (std::string context,
+                                  Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+  m_packets.m_inNacks++;
+  m_bytes.m_inNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropNacks (std::string context,
+                                  Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+  m_packets.m_dropNacks++;
+  m_bytes.m_dropNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::OutData  (std::string context,
+                                 Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                                 bool fromCache, Ptr<const CcnxFace>)
+{
+  m_packets.m_outData++;
+  m_bytes.m_outData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InData   (std::string context,
+                                 Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                                 Ptr<const CcnxFace>)
+{
+  m_packets.m_inData++;
+  m_bytes.m_inData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropData (std::string context,
+                                 Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                                 Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+  m_packets.m_dropData++;
+  m_bytes.m_dropData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-aggregate-l3-tracer.h b/helper/tracers/ccnx-aggregate-l3-tracer.h
new file mode 100644
index 0000000..8536258
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-l3-tracer.h
@@ -0,0 +1,88 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_AGGREGATE_L3_TRACER_H
+#define CCNX_AGGREGATE_L3_TRACER_H
+
+#include "ns3/ccnx-l3-tracer.h"
+
+namespace ns3 {
+
+class CcnxAggregateL3Tracer : public CcnxL3Tracer
+{
+public:
+  CcnxAggregateL3Tracer (Ptr<Node> node);
+  CcnxAggregateL3Tracer (const std::string &node);
+  virtual ~CcnxAggregateL3Tracer () { };
+  
+  virtual void
+  PrintHeader (std::ostream &os) const;
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual void
+  OutInterests  (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  InInterests   (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropInterests (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+  
+  virtual void
+  OutNacks  (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  InNacks   (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropNacks (std::string context,
+             Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+  
+  virtual void
+  OutData  (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
+
+  virtual void
+  InData   (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropData (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+protected:
+  void
+  Reset ();
+  
+protected:
+  Stats m_packets;
+  Stats m_bytes;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_L3_TRACER_H
diff --git a/helper/tracers/ccnx-app-tracer.cc b/helper/tracers/ccnx-app-tracer.cc
new file mode 100644
index 0000000..a2bbbdd
--- /dev/null
+++ b/helper/tracers/ccnx-app-tracer.cc
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/names.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+using namespace std;
+using namespace boost;
+
+namespace ns3 {
+    
+CcnxAppTracer::CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
+  : m_app (app)
+  , m_appId (appId)
+  , m_nodePtr (node)
+{
+  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+  Connect ();
+
+  string name = Names::FindName (node);
+  if (!name.empty ())
+    {
+      m_node = name;
+    }
+}
+
+CcnxAppTracer::CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId)
+  : m_app (app)
+  , m_appId (appId)
+  , m_node (node)
+{
+  Connect ();
+}
+
+void
+CcnxAppTracer::Connect ()
+{
+  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedInterests",
+                   MakeCallback (&CcnxAppTracer::OutInterests, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedNacks",
+                   MakeCallback (&CcnxAppTracer::InNacks, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedInterests",
+                   MakeCallback (&CcnxAppTracer::InInterests, this));
+  
+  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedContentObjects",
+                   MakeCallback (&CcnxAppTracer::OutData, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedContentObjects",
+                   MakeCallback (&CcnxAppTracer::InData, this));
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-app-tracer.h b/helper/tracers/ccnx-app-tracer.h
new file mode 100644
index 0000000..fd9f42d
--- /dev/null
+++ b/helper/tracers/ccnx-app-tracer.h
@@ -0,0 +1,87 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_APP_TRACER_H
+#define CCNX_APP_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ccnx.h"
+
+namespace ns3 {
+
+class CcnxApp;
+
+class CcnxAppTracer : public SimpleRefCount<CcnxAppTracer>
+{
+public:
+  CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+  CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
+  virtual ~CcnxAppTracer ()  { };
+
+  void
+  Connect ();
+
+  virtual void
+  PrintHeader (std::ostream &os) const = 0;
+  
+  virtual void
+  Print (std::ostream &os) const = 0;
+
+  virtual void
+  OutInterests (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+  virtual void
+  InInterests  (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+  virtual void
+  InNacks (std::string context,
+           Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+  virtual void
+  OutData (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+  
+  virtual void
+  InData  (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+protected:
+  std::string m_app;
+  std::string m_appId;
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const CcnxAppTracer &tracer)
+{
+  os << "# ";
+  tracer.PrintHeader (os);
+  os << "\n";
+  tracer.Print (os);
+  return os;
+}
+
+} // namespace ns3
+
+#endif // CCNX_APP_TRACER_H
diff --git a/helper/tracers/ccnx-l3-tracer.cc b/helper/tracers/ccnx-l3-tracer.cc
new file mode 100644
index 0000000..415105b
--- /dev/null
+++ b/helper/tracers/ccnx-l3-tracer.cc
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+using namespace std;
+
+namespace ns3 {
+    
+CcnxL3Tracer::CcnxL3Tracer (Ptr<Node> node)
+: m_nodePtr (node)
+{
+  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+  Connect ();
+
+  string name = Names::FindName (node);
+  if (!name.empty ())
+    {
+      m_node = name;
+    }
+}
+
+CcnxL3Tracer::CcnxL3Tracer (const std::string &node)
+: m_node (node)
+{
+  Connect ();
+}
+
+void
+CcnxL3Tracer::Connect ()
+{
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/ForwardingStrategy/OutInterests",
+                   MakeCallback (&CcnxL3Tracer::OutInterests, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InInterests",
+                   MakeCallback (&CcnxL3Tracer::InInterests, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropInterests",
+                   MakeCallback (&CcnxL3Tracer::DropInterests, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutNacks",
+                   MakeCallback (&CcnxL3Tracer::OutNacks, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InNacks",
+                   MakeCallback (&CcnxL3Tracer::InNacks, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropNacks",
+                   MakeCallback (&CcnxL3Tracer::DropNacks, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutData",
+                   MakeCallback (&CcnxL3Tracer::OutData, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InData",
+                   MakeCallback (&CcnxL3Tracer::InData, this));
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropData",
+                   MakeCallback (&CcnxL3Tracer::DropData, this));
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-l3-tracer.h b/helper/tracers/ccnx-l3-tracer.h
new file mode 100644
index 0000000..ac21cef
--- /dev/null
+++ b/helper/tracers/ccnx-l3-tracer.h
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_L3_TRACER_H
+#define CCNX_L3_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ccnx.h"
+
+namespace ns3 {
+
+class Node;
+
+class CcnxL3Tracer : public SimpleRefCount<CcnxL3Tracer>
+{
+public:
+  CcnxL3Tracer (Ptr<Node> node);
+  CcnxL3Tracer (const std::string &node);
+  virtual ~CcnxL3Tracer () { };
+
+  void
+  Connect ();
+  
+  virtual void
+  PrintHeader (std::ostream &os) const = 0;
+
+  virtual void
+  Print (std::ostream &os) const = 0;
+  
+  virtual void
+  OutInterests  (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  InInterests   (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  DropInterests (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+  
+  virtual void
+  OutNacks  (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  InNacks   (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  DropNacks (std::string context,
+             Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+
+  
+  virtual void
+  OutData  (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  InData   (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>) = 0;
+
+  virtual void
+  DropData (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+
+protected:
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+
+  struct Stats
+  {
+    void Reset ();
+    
+    uint64_t m_inInterests;
+    uint64_t m_outInterests;
+    uint64_t m_dropInterests;
+    uint64_t m_inNacks;
+    uint64_t m_outNacks;
+    uint64_t m_dropNacks;
+    uint64_t m_inData;
+    uint64_t m_outData;
+    uint64_t m_dropData;
+  };
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const CcnxL3Tracer &tracer)
+{
+  os << "# ";
+  tracer.PrintHeader (os);
+  os << "\n";
+  tracer.Print (os);
+  return os;
+}
+
+} // namespace ns3
+
+#endif // CCNX_L3_TRACER_H
diff --git a/helper/tracers/ccnx-rate-l3-tracer.cc b/helper/tracers/ccnx-rate-l3-tracer.cc
new file mode 100644
index 0000000..d44ce44
--- /dev/null
+++ b/helper/tracers/ccnx-rate-l3-tracer.cc
@@ -0,0 +1,213 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-rate-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+    
+CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node)
+  : CcnxL3Tracer (node)
+  , m_os (os)
+{
+  SetAveragingPeriod (Seconds (1.0));
+}
+
+CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, const std::string &node)
+  : CcnxL3Tracer (node)
+  , m_os (os)
+{
+  SetAveragingPeriod (Seconds (1.0));
+}
+
+CcnxRateL3Tracer::~CcnxRateL3Tracer ()
+{
+  m_printEvent.Cancel ();
+}
+
+void
+CcnxRateL3Tracer::SetAveragingPeriod (const Time &period)
+{
+  m_period = period;
+  m_printEvent.Cancel ();
+  m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
+}
+
+void
+CcnxRateL3Tracer::PeriodicPrinter ()
+{
+  Print (m_os);
+  Reset ();
+  
+  m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
+}
+
+void
+CcnxRateL3Tracer::PrintHeader (std::ostream &os) const
+{
+  os << "Time" << "\t"
+
+     << "Node" << "\t"
+     << "FaceId" << "\t"
+     << "FaceDescr" << "\t"
+
+     << "Type" << "\t"
+     << "Packets" << "\t"
+     << "Kilobytes";
+}
+
+void
+CcnxRateL3Tracer::Reset ()
+{
+  for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
+       stats != m_stats.end ();
+       stats++)
+    {
+      stats->second.get<0> ().Reset ();
+      stats->second.get<1> ().Reset ();
+    }
+}
+
+const double alpha = 0.8;
+
+#define STATS(INDEX) stats->second.get<INDEX> ()
+#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble (Time::S)
+
+#define PRINTER(printName, fieldName) \
+STATS(2).fieldName = /*new value*/alpha * RATE(0, fieldName) + /*old value*/(1-alpha) * STATS(2).fieldName; \
+ STATS(3).fieldName = /*new value*/alpha * RATE(1, fieldName) / 1024.0 + /*old value*/(1-alpha) * STATS(3).fieldName; \
+                                                                        \
+os << time.ToDouble (Time::S) << "\t"                                   \
+ << m_node << "\t"                                                      \
+ << stats->first->GetId () << "\t"                                      \
+ << *stats->first << "\t"                                               \
+ << printName << "\t"                                                   \
+ << STATS(2).fieldName  << "\t"                                        \
+ << STATS(3).fieldName << "\n";
+
+void
+CcnxRateL3Tracer::Print (std::ostream &os) const
+{
+  for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
+       stats != m_stats.end ();
+       stats++)
+    {
+      Time time = Simulator::Now ();
+
+      PRINTER ("InInterests",   m_inInterests);
+      PRINTER ("OutInterests",  m_outInterests);
+      PRINTER ("DropInterests", m_dropInterests);
+      
+      PRINTER ("InNacks",   m_inNacks);
+      PRINTER ("OutNacks",  m_outNacks);
+      PRINTER ("DropNacks", m_dropNacks);
+
+      PRINTER ("InData",   m_inData);
+      PRINTER ("OutData",  m_outData);
+      PRINTER ("DropData", m_dropData);
+    }
+}
+
+
+void
+CcnxRateL3Tracer::OutInterests  (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_outInterests ++;
+  m_stats[face].get<1> ().m_outInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::InInterests   (std::string context,
+                                 Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_inInterests ++;
+  m_stats[face].get<1> ().m_inInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::DropInterests (std::string context,
+                                      Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_dropInterests ++;
+  m_stats[face].get<1> ().m_dropInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::OutNacks  (std::string context,
+                                  Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_outNacks ++;
+  m_stats[face].get<1> ().m_outNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::InNacks   (std::string context,
+                                  Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_inNacks ++;
+  m_stats[face].get<1> ().m_inNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::DropNacks (std::string context,
+                             Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_dropNacks ++;
+  m_stats[face].get<1> ().m_dropNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::OutData  (std::string context,
+                            Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                            bool fromCache, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_inData ++;
+  m_stats[face].get<1> ().m_inData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxRateL3Tracer::InData   (std::string context,
+                            Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                            Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_outData ++;
+  m_stats[face].get<1> ().m_outData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxRateL3Tracer::DropData (std::string context,
+                            Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+                            Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+  m_stats[face].get<0> ().m_dropData ++;
+  m_stats[face].get<1> ().m_dropData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-rate-l3-tracer.h b/helper/tracers/ccnx-rate-l3-tracer.h
new file mode 100644
index 0000000..83e48c4
--- /dev/null
+++ b/helper/tracers/ccnx-rate-l3-tracer.h
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_RATE_L3_TRACER_H
+#define CCNX_RATE_L3_TRACER_H
+
+#include "ns3/ccnx-l3-tracer.h"
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+
+#include <boost/tuple/tuple.hpp>
+#include <map>
+
+namespace ns3 {
+
+/**
+ * @ingroup ccnx
+ * @brief CCNx network-layer rate tracer
+ */
+class CcnxRateL3Tracer : public CcnxL3Tracer
+{
+public:
+  /**
+   * @brief Network layer tracer constructor
+   */
+  CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node);
+  CcnxRateL3Tracer (std::ostream &os, const std::string &node);
+  virtual ~CcnxRateL3Tracer ();
+
+  void
+  SetAveragingPeriod (const Time &period);
+  
+  virtual void
+  PrintHeader (std::ostream &os) const;
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual void
+  OutInterests  (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  InInterests   (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropInterests (std::string context,
+                 Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+  
+  virtual void
+  OutNacks  (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  InNacks   (std::string context,
+             Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropNacks (std::string context,
+             Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+  
+  virtual void
+  OutData  (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
+
+  virtual void
+  InData   (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>);
+
+  virtual void
+  DropData (std::string context,
+            Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+private:
+  void
+  PeriodicPrinter ();
+  
+  void
+  Reset ();
+
+private:
+  std::ostream& m_os;
+  Time m_period;
+  EventId m_printEvent;
+
+  mutable std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> > m_stats;
+};
+
+} // namespace ns3
+
+#endif // CCNX_RATE_L3_TRACER_H
diff --git a/helper/tracers/ccnx-seqs-app-tracer.cc b/helper/tracers/ccnx-seqs-app-tracer.cc
new file mode 100644
index 0000000..5ea636e
--- /dev/null
+++ b/helper/tracers/ccnx-seqs-app-tracer.cc
@@ -0,0 +1,116 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-seqs-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+    
+CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId)
+  : CcnxAppTracer (app, node, appId)
+  , m_os (os)
+{
+}
+
+CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId)
+  : CcnxAppTracer (app, node, appId)
+  , m_os (os)
+{
+}
+
+void
+CcnxSeqsAppTracer::Reset ()
+{
+}
+
+void
+CcnxSeqsAppTracer::PrintHeader (std::ostream &os) const
+{
+  os << "Time\t"
+     << "Node\t"
+     << "AppName\t"
+     << "AppId\t"
+     << "Type\t"
+     << "SeqNo";
+}
+
+void
+CcnxSeqsAppTracer::Print (std::ostream &os) const
+{
+}
+
+#define PRINTER(type)                                              \
+ m_os                                                              \
+ << Simulator::Now ().ToDouble (Time::S) << "\t"                   \
+ << m_node << "\t"                                                 \
+ << m_app << "\t"                                                  \
+ << m_appId << "\t"                                                \
+ << type << "\t"                                                   \
+ << header->GetName ().GetLastComponent () << std::endl;
+
+void
+CcnxSeqsAppTracer::OutInterests (std::string context,
+                                 Ptr<const CcnxInterestHeader> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  PRINTER ("OutInterest");
+}
+
+void
+CcnxSeqsAppTracer::OutData (std::string context,
+                            Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet>,
+                            Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  PRINTER ("OutData");
+}
+
+void
+CcnxSeqsAppTracer::InInterests (std::string context,
+                                Ptr<const CcnxInterestHeader> header,
+                                Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  PRINTER ("InInterest");
+}
+
+void
+CcnxSeqsAppTracer::InNacks (std::string context,
+                            Ptr<const CcnxInterestHeader> header,
+                            Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  PRINTER ("InNacks");
+}
+  
+void
+CcnxSeqsAppTracer::InData (std::string context,
+                           Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet>,
+                           Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+  PRINTER ("InData");
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-seqs-app-tracer.h b/helper/tracers/ccnx-seqs-app-tracer.h
new file mode 100644
index 0000000..b0fd618
--- /dev/null
+++ b/helper/tracers/ccnx-seqs-app-tracer.h
@@ -0,0 +1,71 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_SEQS_APP_TRACER_H
+#define CCNX_SEQS_APP_TRACER_H
+
+#include "ns3/ccnx-app-tracer.h"
+
+namespace ns3 {
+
+class CcnxSeqsAppTracer : public CcnxAppTracer
+{
+public:
+  CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+  CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId = "*");
+  virtual ~CcnxSeqsAppTracer () { };
+
+  virtual void
+  PrintHeader (std::ostream &os) const;
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual void
+  OutInterests (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  InInterests  (std::string context,
+                Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  InNacks (std::string context,
+           Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+  virtual void
+  OutData (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+  
+  virtual void
+  InData  (std::string context,
+           Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+protected:
+  void
+  Reset ();
+
+protected:
+  std::ostream& m_os;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/helper/tracers/ipv4-app-tracer.cc b/helper/tracers/ipv4-app-tracer.cc
new file mode 100644
index 0000000..57fb612
--- /dev/null
+++ b/helper/tracers/ipv4-app-tracer.cc
@@ -0,0 +1,70 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ipv4-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/names.h"
+
+#include <boost/lexical_cast.hpp>
+
+using namespace std;
+using namespace boost;
+
+namespace ns3 {
+    
+Ipv4AppTracer::Ipv4AppTracer (Ptr<Node> node, const std::string &appId)
+  : m_appId (appId)
+  , m_nodePtr (node)
+{
+  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+  Connect ();
+
+  string name = Names::FindName (node);
+  if (!name.empty ())
+    {
+      m_node = name;
+    }
+}
+
+void
+Ipv4AppTracer::Connect ()
+{
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/SendOutgoing",
+                   MakeCallback (&Ipv4AppTracer::Tx, this));
+
+  Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/LocalDeliver",
+                   MakeCallback (&Ipv4AppTracer::Rx, this));
+  
+  // Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/Tx",
+  //                  MakeCallback (&Ipv4AppTracer::Rx, this));
+
+  // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::PacketSink/Rx",
+  //                  MakeCallback (&Ipv4AppTracer::InData, this));
+
+  // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::BulkSendApplication/Tx",
+  //                  MakeCallback (&Ipv4AppTracer::OutData, this));
+}
+
+
+} // namespace ns3
diff --git a/helper/tracers/ipv4-app-tracer.h b/helper/tracers/ipv4-app-tracer.h
new file mode 100644
index 0000000..f24c6c3
--- /dev/null
+++ b/helper/tracers/ipv4-app-tracer.h
@@ -0,0 +1,74 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef IPV4_APP_TRACER_H
+#define IPV4_APP_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ipv4.h"
+
+namespace ns3 {
+
+class Ipv4Header;
+
+class Ipv4AppTracer : public SimpleRefCount<Ipv4AppTracer>
+{
+public:
+  Ipv4AppTracer (Ptr<Node> node, const std::string &appId = "*");
+  virtual ~Ipv4AppTracer ()  { };
+
+  void
+  Connect ();
+
+  virtual void
+  PrintHeader (std::ostream &os) const = 0;
+  
+  virtual void
+  Print (std::ostream &os) const = 0;
+
+  virtual void
+  Rx (std::string context,
+      const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
+  
+  virtual void
+  Tx (std::string context,
+      const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
+  
+protected:
+  std::string m_app;
+  std::string m_appId;
+  std::string m_node;
+  Ptr<Node> m_nodePtr;
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const Ipv4AppTracer &tracer)
+{
+  os << "# ";
+  tracer.PrintHeader (os);
+  os << "\n";
+  tracer.Print (os);
+  return os;
+}
+
+} // namespace ns3
+
+#endif // IPV4_APP_TRACER_H
diff --git a/helper/tracers/ipv4-seqs-app-tracer.cc b/helper/tracers/ipv4-seqs-app-tracer.cc
new file mode 100644
index 0000000..3147ed0
--- /dev/null
+++ b/helper/tracers/ipv4-seqs-app-tracer.cc
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ipv4-seqs-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/tcp-l4-protocol.h"
+#include "ns3/tcp-header.h"
+#include "ns3/ipv4-header.h"
+
+namespace ns3 {
+    
+Ipv4SeqsAppTracer::Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId)
+  : Ipv4AppTracer (node, appId)
+  , m_os (os)
+{
+}
+
+void
+Ipv4SeqsAppTracer::Reset ()
+{
+}
+
+void
+Ipv4SeqsAppTracer::PrintHeader (std::ostream &os) const
+{
+  os << "Time\t"
+     << "Node\t"
+     << "AppName\t"
+     << "AppId\t"
+     << "Type\t"
+     << "SeqNo";
+}
+
+void
+Ipv4SeqsAppTracer::Print (std::ostream &os) const
+{
+}
+
+#define PRINTER(type,size)                                         \
+ m_os                                                              \
+ << Simulator::Now ().ToDouble (Time::S) << "\t"                   \
+ << m_node << "\t"                                                 \
+ << m_app << "\t"                                                  \
+ << m_appId << "\t"                                                \
+ << type << "\t"                                                   \
+ << size / 1040.0 << std::endl;
+
+void
+Ipv4SeqsAppTracer::Tx (std::string context,
+    const Ipv4Header &ip, Ptr<const Packet>, uint32_t)
+{
+  if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
+}
+
+void
+Ipv4SeqsAppTracer::Rx (std::string context,
+                       const Ipv4Header &ip, Ptr<const Packet> pktOrig, uint32_t)
+{
+  if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
+
+  TcpHeader tcp;
+  Ptr<Packet> packet = pktOrig->Copy ();
+  packet->RemoveHeader (tcp);
+
+  if (tcp.GetFlags () | TcpHeader::ACK)
+    {
+      PRINTER("InAck", tcp.GetAckNumber ().GetValue ());
+    }
+}
+  
+
+// void
+// Ipv4SeqsAppTracer::InData (std::string context,
+//                            Ptr<const Packet> packet, const Address &address)
+// {
+//   PRINTER ("InData", m_inSeq);
+//   m_inSeq += packet->GetSize ();
+// }
+  
+// void
+// Ipv4SeqsAppTracer::OutData (std::string context,
+//                             Ptr<const Packet> packet)
+// {
+//   PRINTER ("OutData", m_outSeq);
+//   m_outSeq += packet->GetSize ();
+// }
+
+} // namespace ns3
diff --git a/helper/tracers/ipv4-seqs-app-tracer.h b/helper/tracers/ipv4-seqs-app-tracer.h
new file mode 100644
index 0000000..4805968
--- /dev/null
+++ b/helper/tracers/ipv4-seqs-app-tracer.h
@@ -0,0 +1,58 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef IPV4_SEQS_APP_TRACER_H
+#define IPV4_SEQS_APP_TRACER_H
+
+#include "ns3/ipv4-app-tracer.h"
+
+namespace ns3 {
+
+class Ipv4SeqsAppTracer : public Ipv4AppTracer
+{
+public:
+  Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*");
+  virtual ~Ipv4SeqsAppTracer () { };
+
+  virtual void
+  PrintHeader (std::ostream &os) const;
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual void
+  Rx (std::string context,
+      const Ipv4Header &, Ptr<const Packet>, uint32_t);
+  
+  virtual void
+  Tx (std::string context,
+      const Ipv4Header &, Ptr<const Packet>, uint32_t);
+
+protected:
+  void
+  Reset ();
+
+protected:
+  std::ostream& m_os;
+};
+
+} // namespace ns3
+
+#endif // IPV4_AGGREGATE_APP_TRACER_H
diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index 15c0d6b..194a90c 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -52,10 +52,11 @@
 
 NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
     
-AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path)
+AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path, double scale/*=1.0*/)
   : m_path (path)
   , m_randX (0, 100.0)
   , m_randY (0, 100.0)
+  , m_scale (scale)
 {
   NS_LOG_FUNCTION (this);
 
@@ -100,21 +101,28 @@
   loc->SetPosition (Vector (posX, posY, 0));
 
   Names::Add (m_path, name, node);
+  m_nodes.Add (node);
 
   return node;
 }
 
 NodeContainer
+AnnotatedTopologyReader::GetNodes () const
+{
+  return m_nodes;
+}
+
+
+NodeContainer
 AnnotatedTopologyReader::Read (void)
 {
   ifstream topgen;
   topgen.open (GetFileName ().c_str ());
-  NodeContainer nodes;
         
   if ( !topgen.is_open () )
     {
       NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
-      return nodes;
+      return m_nodes;
     }
 
   while (!topgen.eof ())
@@ -137,8 +145,9 @@
       double latitude, longitude;
 
       lineBuffer >> name >> city >> latitude >> longitude;
-      Ptr<Node> node = CreateNode (name, 2*longitude, -2*latitude);
-      nodes.Add (node);
+      if (name.empty ()) continue;
+
+      Ptr<Node> node = CreateNode (name, m_scale*longitude, -m_scale*latitude);
     }
 
   map<string, set<string> > processedLinks; // to eliminate duplications
@@ -154,9 +163,9 @@
       // NS_LOG_DEBUG ("Input: [" << line << "]");
       
       istringstream lineBuffer (line);
-      string from, to, capacity, metric, delay, queueSizeNode1, queueSizeNode2;
+      string from, to, capacity, metric, delay, maxPackets;
 
-      lineBuffer >> from >> to >> capacity >> metric >> delay >> queueSizeNode1 >> queueSizeNode2;
+      lineBuffer >> from >> to >> capacity >> metric >> delay >> maxPackets;
 
       if (processedLinks[to].size () != 0 &&
           processedLinks[to].find (from) != processedLinks[to].end ())
@@ -177,21 +186,19 @@
 
       if (!delay.empty ())
           link.SetAttribute ("Delay", delay);
-      if (!queueSizeNode1.empty ())
-        link.SetAttribute ("QueueSizeNode1", queueSizeNode1);
-      if (!queueSizeNode2.empty ())
-        link.SetAttribute ("QueueSizeNode2", queueSizeNode2);
+      if (!maxPackets.empty ())
+        link.SetAttribute ("MaxPackets", maxPackets);
 
       AddLink (link);
-      NS_LOG_DEBUG ("New link " << from << " <==> " << to << " / " << capacity << "Kbps with " << metric << " metric");
+      NS_LOG_DEBUG ("New link " << from << " <==> " << to << " / " << capacity << " with " << metric << " metric (" << delay << ", " << maxPackets << ")");
     }
         
-  NS_LOG_INFO ("Annotated topology created with " << nodes.GetN () << " nodes and " << LinksSize () << " links");
+  NS_LOG_INFO ("Annotated topology created with " << m_nodes.GetN () << " nodes and " << LinksSize () << " links");
   topgen.close ();
         
   ApplySettings ();
   
-  return nodes;
+  return m_nodes;
 }
     
 void
@@ -252,38 +259,34 @@
 
       if (link.GetAttributeFailSafe ("DataRate", tmp))
         {
-          NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate")+"Kbps");
-          p2p.SetDeviceAttribute ("DataRate", StringValue(link.GetAttribute("DataRate")+"Kbps"));
+          NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate"));
+          p2p.SetDeviceAttribute ("DataRate", StringValue (link.GetAttribute ("DataRate")));
         }
 
-      if (link.GetAttributeFailSafe("Delay", tmp))
+      if (link.GetAttributeFailSafe ("Delay", tmp))
         {
-          NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay")+"ms");
-          p2p.SetChannelAttribute ("Delay", StringValue(link.GetAttribute("Delay")+"ms"));
+          NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay"));
+          p2p.SetChannelAttribute ("Delay", StringValue (link.GetAttribute ("Delay")));
         }
-        
+
       NetDeviceContainer nd = p2p.Install(link.GetFromNode (), link.GetToNode ());
       link.SetNetDevices (nd.Get (0), nd.Get (1));
 
-      if (link.GetAttributeFailSafe("QueueSizeNode1", tmp))
+      if (link.GetAttributeFailSafe ("MaxPackets", tmp))
         {
-          PointerValue txQueueFrom;
-          link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueueFrom);
-          NS_ASSERT (txQueueFrom.Get<DropTailQueue> () != 0);
+          NS_LOG_INFO ("MaxPackets = " + link.GetAttribute ("MaxPackets"));
 
-          NS_LOG_INFO ("QueueFrom: " << link.GetAttribute("QueueSizeNode1"));
-          txQueueFrom.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode1")));
+          PointerValue txQueue;
+
+          link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueue);
+          NS_ASSERT (txQueue.Get<DropTailQueue> () != 0);       
+          txQueue.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute ("MaxPackets")));
+
+          link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueue);
+          NS_ASSERT (txQueue.Get<DropTailQueue> () != 0);
+          txQueue.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute ("MaxPackets")));
         }
-      
-      if (link.GetAttributeFailSafe("QueueSizeNode2", tmp))
-        {
-          PointerValue txQueueTo;
-          link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueueTo);
-          NS_ASSERT (txQueueTo.Get<DropTailQueue> () != 0);
         
-          NS_LOG_INFO ("QueueTo: " << link.GetAttribute("QueueSizeNode2"));
-          txQueueTo.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode2")));
-        }
     }
 }
 
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index 4bacd2a..b9268b8 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -39,10 +39,11 @@
    * \brief Constructor
    *
    * \param path ns3::Names path
+   * \param scale Scaling factor for coordinates in input file
    *
    * \see ns3::Names class
    */
-  AnnotatedTopologyReader (const std::string &path="");
+  AnnotatedTopologyReader (const std::string &path="", double scale=1.0);
   virtual ~AnnotatedTopologyReader ();
         
   /**
@@ -52,8 +53,14 @@
    *
    * \return the container of the nodes created (or empty container if there was an error)
    */
-  virtual
-  NodeContainer Read (void);
+  virtual NodeContainer
+  Read ();
+
+  /**
+   * \brief Get nodes read by the reader
+   */
+  NodeContainer
+  GetNodes () const;
     
   /**
    * \brief Assign IPv4 addresses to all links
@@ -91,6 +98,7 @@
     
 protected:
   std::string m_path;
+  NodeContainer m_nodes;
 
 private:
   AnnotatedTopologyReader (const AnnotatedTopologyReader&);
@@ -100,6 +108,7 @@
   UniformVariable m_randY;
 
   ObjectFactory m_mobilityFactory;
+  double m_scale;
 };
 
 }
diff --git a/model/ccnx-bestroute-strategy.cc b/model/ccnx-bestroute-strategy.cc
index b850d08..2bbe287 100644
--- a/model/ccnx-bestroute-strategy.cc
+++ b/model/ccnx-bestroute-strategy.cc
@@ -19,7 +19,10 @@
  */
 
 #include "ccnx-bestroute-strategy.h"
+
 #include "ccnx-interest-header.h"
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
 
 #include "ns3/assert.h"
 #include "ns3/log.h"
@@ -83,6 +86,7 @@
       if (outgoing != pitEntry.m_outgoing.end () &&
           outgoing->m_retxCount >= pitEntry.m_maxRetxCount)
         {
+          NS_LOG_ERROR (outgoing->m_retxCount << " >= " << pitEntry.m_maxRetxCount);
           continue; // already forwarded before during this retransmission cycle
         }
 
@@ -96,6 +100,7 @@
                      ll::bind(&CcnxPitEntry::AddOutgoing, ll::_1, metricFace.m_face));
 
       metricFace.m_face->Send (packet->Copy ());
+      m_transmittedInterestsTrace (header, metricFace.m_face);
       
       propagatedCount++;
       break; // do only once
diff --git a/model/ccnx-content-store.cc b/model/ccnx-content-store.cc
index 4875386..b0c4858 100644
--- a/model/ccnx-content-store.cc
+++ b/model/ccnx-content-store.cc
@@ -150,7 +150,7 @@
 }
 
 
-boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader> >
+boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
 CcnxContentStore::Lookup (Ptr<const CcnxInterestHeader> interest)
 {
   NS_LOG_FUNCTION_NOARGS ();
@@ -162,9 +162,9 @@
                                            m_contentStore.project<i_mru> (it));
 
       // return fully formed CCNx packet
-      return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader ());
+      return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader (), it->GetPacket ());
     }
-  return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader> > (0, 0);
+  return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
 }   
     
 void 
diff --git a/model/ccnx-content-store.h b/model/ccnx-content-store.h
index dd0f884..9f07a47 100644
--- a/model/ccnx-content-store.h
+++ b/model/ccnx-content-store.h
@@ -174,7 +174,7 @@
    * If an entry is found, it is promoted to the top of most recent
    * used entries index, \see m_contentStore
    */
-  boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader> >
+  boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
   Lookup (Ptr<const CcnxInterestHeader> interest);
             
   /**
@@ -215,22 +215,6 @@
    * Release build dumps everything in MRU order
    */
   void Print () const;
-            
-protected:
-  // /**
-  //  * \brief Move the given CS entry to the head of the list
-  //  *
-  //  * \param entry Content Store entry
-  //  */
-  // void Promote( CsEntry &entry );
-
-  /**
-   * \todo Alex: DoDispose and NotifyNewAggregate are seem to be very
-   * important, but I'm not yet sure what exactly they are supposed to
-   * do
-   */
-  // virtual void DoDispose ();
-  // virtual void NotifyNewAggregate ();
 
 private:
   CcnxContentStore (const CcnxContentStore &o); ///< Disabled copy constructor
@@ -244,7 +228,7 @@
    * \brief Content store implemented as a Boost.MultiIndex container
    * \internal
    */
-    CcnxContentStoreContainer::type m_contentStore;
+  CcnxContentStoreContainer::type m_contentStore;
 };
 
 inline std::ostream&
diff --git a/model/ccnx-face.cc b/model/ccnx-face.cc
index 17d0612..77122e0 100644
--- a/model/ccnx-face.cc
+++ b/model/ccnx-face.cc
@@ -27,6 +27,7 @@
 #include "ns3/assert.h"
 #include "ns3/uinteger.h"
 #include "ns3/double.h"
+#include "ns3/simulator.h"
 
 #include <boost/ref.hpp>
 
@@ -72,6 +73,7 @@
   , m_protocolHandler (MakeNullCallback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>&> ())
   , m_ifup (false)
   , m_id ((uint32_t)-1)
+  , m_lastLeakTime (0)
 {
   NS_LOG_FUNCTION (this);
 
@@ -109,10 +111,12 @@
   
   if (!IsUp ())
     return false;
+
+  LeakBucket ();
   
   if (m_bucketMax > 0)
     {
-      //NS_LOG_DEBUG ("Limits enabled: " << m_bucketMax << ", current: " << m_bucket);
+      NS_LOG_DEBUG ("Limits enabled: " << m_bucketMax << ", current: " << m_bucket);
       if (m_bucket+1.0 > m_bucketMax)
         {
           //NS_LOG_DEBUG ("Returning false");
@@ -155,10 +159,21 @@
 }
 
 void
-CcnxFace::LeakBucket (const Time &interval)
+CcnxFace::LeakBucket ()
 {
+  if (m_lastLeakTime.IsZero ())
+    {
+      m_lastLeakTime = Simulator::Now ();
+      return;
+    }
+
+  Time interval = Simulator::Now () - m_lastLeakTime;
   const double leak = m_bucketLeak * interval.ToDouble (Time::S);
-  m_bucket = std::max (0.0, m_bucket - leak);
+  if (leak >= 1.0)
+    {
+      m_bucket = std::max (0.0, m_bucket - leak);
+      m_lastLeakTime = Simulator::Now ();
+    }
 
   // NS_LOG_DEBUG ("max: " << m_bucketMax << ", Current bucket: " << m_bucket << ", leak size: " << leak << ", interval: " << interval << ", " << m_bucketLeak);
 }
@@ -177,12 +192,6 @@
   m_bucketLeak = leak;
 }
 
-void
-CcnxFace::LeakBucketByOnePacket ()
-{
-  m_bucket = std::max (0.0, m_bucket-1.0); 
-}
-
 // void
 // CcnxFace::SetMetric (uint16_t metric)
 // {
@@ -202,6 +211,7 @@
  * NetDevice states, such as found in real implementations
  * (where the device may be down but face state is still up).
  */
+
 bool 
 CcnxFace::IsUp (void) const
 {
diff --git a/model/ccnx-face.h b/model/ccnx-face.h
index e0deb2a..df488dc 100644
--- a/model/ccnx-face.h
+++ b/model/ccnx-face.h
@@ -178,16 +178,12 @@
   SetBucketLeak (double leak);
   
   /**
-   * @brief Leak the Interest allowance bucket by (1/interval) * m_bucketMax amount
-   *
-   * @param interval Time interval with which the bucket is leaked
+   * @brief Leak the Interest allowance bucket by (1/interval) * m_bucketMax amount,
+   * where interval is time between two consecutive calls of LeakBucket
    */
   void
-  LeakBucket (const Time &interval);
+  LeakBucket ();
 
-  void
-  LeakBucketByOnePacket ();
-  
   /**
    * \brief Compare two faces. Only two faces on the same node could be compared.
    *
@@ -228,7 +224,8 @@
 private:
   ProtocolHandler m_protocolHandler; ///< Callback via which packets are getting send to CCNx stack
   bool m_ifup; ///< \brief flag indicating that the interface is UP 
-  uint32_t m_id; ///< \brief id of the interface in CCNx stack (per-node uniqueness)  
+  uint32_t m_id; ///< \brief id of the interface in CCNx stack (per-node uniqueness)
+  Time m_lastLeakTime; 
 };
 
 std::ostream& operator<< (std::ostream& os, const CcnxFace &face);
diff --git a/model/ccnx-flooding-strategy.cc b/model/ccnx-flooding-strategy.cc
index 4a8dd50..5b8542d 100644
--- a/model/ccnx-flooding-strategy.cc
+++ b/model/ccnx-flooding-strategy.cc
@@ -19,10 +19,13 @@
  */
 
 #include "ccnx-flooding-strategy.h"
+#include "ccnx-interest-header.h"
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
+
 #include "ns3/assert.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
-#include "ccnx-interest-header.h"
 
 #include <boost/ref.hpp>
 #include <boost/foreach.hpp>
@@ -114,6 +117,7 @@
       //   }
 
       metricFace.m_face->Send (packet->Copy ());
+      m_transmittedInterestsTrace (header, metricFace.m_face);
       
       propagatedCount++;
     }
diff --git a/model/ccnx-forwarding-strategy.cc b/model/ccnx-forwarding-strategy.cc
index 4a1c3a8..fbd4613 100644
--- a/model/ccnx-forwarding-strategy.cc
+++ b/model/ccnx-forwarding-strategy.cc
@@ -24,6 +24,11 @@
 #include "ccnx-forwarding-strategy.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
+#include "ns3/double.h"
+
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
+
 #include "ccnx-interest-header.h"
 
 #include <boost/ref.hpp>
@@ -45,6 +50,10 @@
   static TypeId tid = TypeId ("ns3::CcnxForwardingStrategy")
     .SetGroupName ("Ccnx")
     .SetParent<Object> ()
+
+    .AddTraceSource ("OutInterests", "Interests that were transmitted",
+                    MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_transmittedInterestsTrace))
+
     ;
   return tid;
 }
@@ -69,7 +78,7 @@
                                                    Ptr<CcnxInterestHeader> &header,
                                                    const Ptr<const Packet> &packet)
 {
-  // NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this);
 
   int propagatedCount = 0;
   
@@ -88,6 +97,7 @@
       if (outgoing != pitEntry.m_outgoing.end () &&
           outgoing->m_retxCount >= pitEntry.m_maxRetxCount)
         {
+          NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry.m_maxRetxCount);
           continue;
         }
       
@@ -102,6 +112,7 @@
                      ll::bind(&CcnxPitEntry::AddOutgoing, ll::_1, metricFace.m_face));
 
       metricFace.m_face->Send (packet->Copy ());
+      m_transmittedInterestsTrace (header, metricFace.m_face);
       
       propagatedCount++;
       break; // propagate only one interest
@@ -117,5 +128,4 @@
   return propagatedCount > 0;
 }
 
-
 } //namespace ns3
diff --git a/model/ccnx-forwarding-strategy.h b/model/ccnx-forwarding-strategy.h
index 9fae7b1..23c15a5 100644
--- a/model/ccnx-forwarding-strategy.h
+++ b/model/ccnx-forwarding-strategy.h
@@ -24,16 +24,14 @@
 #include "ns3/packet.h"
 #include "ns3/callback.h"
 #include "ns3/object.h"
-
-#include "ccnx.h"
-#include "ccnx-fib.h"
-#include "ccnx-pit.h"
-#include "ccnx-pit-entry.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3 {
 
 class CcnxFace;
 class CcnxInterestHeader;
+class CcnxPit;
+class CcnxPitEntry;
 
 /**
  * \ingroup ccnx
@@ -74,7 +72,7 @@
    */
   void
   SetPit (Ptr<CcnxPit> pit);
-
+  
 protected:
   /**
    * @brief Propagate interest via a green interface. Fail, if no green interfaces available
@@ -93,10 +91,11 @@
                              const Ptr<CcnxFace> &incomingFace,
                              Ptr<CcnxInterestHeader> &header,
                              const Ptr<const Packet> &packet);
+
+  TracedCallback<Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
   
 protected:  
   Ptr<CcnxPit> m_pit;
-  Ptr<Ccnx> m_ccnx; // just for tracing purposes. Should not be used in any other way
 };
 
 } //namespace ns3
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index fb1e5e4..223c578 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -31,6 +31,7 @@
 #include "ns3/pointer.h"
 #include "ns3/boolean.h"
 #include "ns3/string.h"
+#include "ns3/simulator.h"
 
 #include "ns3/ccnx-header-helper.h"
 
@@ -74,31 +75,12 @@
                    MakePointerAccessor (&CcnxL3Protocol::SetForwardingStrategy, &CcnxL3Protocol::GetForwardingStrategy),
                    MakePointerChecker<CcnxForwardingStrategy> ())
     
-    .AddAttribute ("BucketLeakInterval",
-                   "Interval to leak buckets",
-                   StringValue ("10ms"),
-                   MakeTimeAccessor (&CcnxL3Protocol::GetBucketLeakInterval,
-                                     &CcnxL3Protocol::SetBucketLeakInterval),
-                   MakeTimeChecker ())
-
-    .AddTraceSource ("TransmittedInterestTrace", "Interests that were transmitted",
-                    MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedInterestsTrace))
-    
-    .AddTraceSource ("ReceivedInterestTrace", "Interests that were received",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedInterestsTrace))
-    
-    .AddTraceSource ("DroppedInterestTrace", "Interests that were dropped",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedInterestsTrace))
-
-    .AddTraceSource ("ReceivedDataTrace", "Data that were received",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedDataTrace))
-    
-    .AddTraceSource ("TransmittedDataTrace", "Data that were transmitted",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedDataTrace))
-    
-    .AddTraceSource ("DroppedDataTrace", "Data that were dropped",
-                     MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedDataTrace))
-
+    // .AddAttribute ("BucketLeakInterval",
+    //                "Interval to leak buckets",
+    //                StringValue ("100ms"),
+    //                MakeTimeAccessor (&CcnxL3Protocol::GetBucketLeakInterval,
+    //                                  &CcnxL3Protocol::SetBucketLeakInterval),
+    //                MakeTimeChecker ())
   ;
   return tid;
 }
@@ -152,9 +134,6 @@
 {
   NS_LOG_FUNCTION (this);
 
-  if (m_bucketLeakEvent.IsRunning ())
-    m_bucketLeakEvent.Cancel ();
-  
   for (CcnxFaceList::iterator i = m_faces.begin (); i != m_faces.end (); ++i)
     {
       *i = 0;
@@ -318,18 +297,17 @@
                         const Ptr<const Packet> &packet)
 {
   NS_LOG_FUNCTION (incomingFace << header << packet);
+  m_inNacks (header, incomingFace);
 
   tuple<const CcnxPitEntry&,bool,bool> ret = m_pit->Lookup (*header);
   CcnxPitEntry const& pitEntry = ret.get<0> ();
   bool isNew = ret.get<1> ();
   bool isDuplicated = ret.get<2> ();
 
-  // NS_ASSERT_MSG (isDuplicated,
-  //                "NACK should be a duplicated interest");
   if (isNew || !isDuplicated) // potential flow
     {
       // somebody is doing something bad
-      m_droppedInterestsTrace (header, NACK_NONDUPLICATE, m_node->GetObject<Ccnx> (), incomingFace);
+      m_dropNacks (header, NON_DUPLICATED, incomingFace);
       return;
     }
   
@@ -338,10 +316,11 @@
 
   if (outFace == pitEntry.m_outgoing.end ())
     {
-      NS_ASSERT_MSG (false,
-                     "Node " << GetObject<Node> ()->GetId () << ", outgoing entry should exist for face " << boost::cref(*incomingFace) << "\n" <<
-                     "size: " << pitEntry.m_outgoing.size ());
+//      NS_ASSERT_MSG (false,
+//                     "Node " << GetObject<Node> ()->GetId () << ", outgoing entry should exist for face " << boost::cref(*incomingFace) << "\n" <<
+//                     "size: " << pitEntry.m_outgoing.size ());
       
+      // m_dropNacks (header, NON_DUPLICATE, incomingFace);
       return;
     }
 
@@ -371,7 +350,7 @@
   if (pitEntry.m_incoming.size () == 0) // interest was actually satisfied
     {
       // no need to do anything
-      m_droppedInterestsTrace (header, NACK_AFTER_SATISFIED, m_node->GetObject<Ccnx> (), incomingFace);
+      m_dropNacks (header, AFTER_SATISFIED, incomingFace);
       return;
     }
 
@@ -380,7 +359,7 @@
       NS_LOG_DEBUG ("Not all outgoing are in vain");
       // suppress
       // Don't do anything, we are still expecting data from some other face
-      m_droppedInterestsTrace (header, NACK_SUPPRESSED, m_node->GetObject<Ccnx> (), incomingFace);
+      m_dropNacks (header, SUPPRESSED, incomingFace);
       return;
     }
   
@@ -397,7 +376,10 @@
   // // If no interests was propagated, then there is not other option for forwarding or
   // // ForwardingStrategy failed to find it. 
   if (!propagated)
-     GiveUpInterest (pitEntry, header);
+    {
+      m_dropNacks (header, NO_FACES, incomingFace); // this headers doesn't have NACK flag set
+      GiveUpInterest (pitEntry, header);
+    }
 }
 
 // Processing Interests
@@ -409,7 +391,7 @@
                                  const Ptr<const Packet> &packet)
 {
   NS_LOG_FUNCTION (incomingFace << header << packet);
-  //m_receivedInterestsTrace (header, m_node->GetObject<Ccnx> (), incomingFace);
+  m_inInterests (header, incomingFace);
 
   // Lookup of Pit (and associated Fib) entry for this Interest 
   tuple<const CcnxPitEntry&,bool,bool> ret = m_pit->Lookup (*header);
@@ -417,40 +399,41 @@
   // bool isNew = ret.get<1> ();
   bool isDuplicated = ret.get<2> ();
 
+  // NS_LOG_DEBUG ("isNew: " << isNew << ", isDup: " << isDuplicated);
+  
   if (isDuplicated) 
     {
+      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.
        */
       
-      // //Trace duplicate interest  
-      // m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
-
       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);
       
-      // //Trace duplicate interest  
-      m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
       return;
     }
 
   Ptr<Packet> contentObject;
-  Ptr<const CcnxContentObjectHeader> contentObjectHeader; // unused for now
-  tie (contentObject, contentObjectHeader) = m_contentStore->Lookup (header);
+  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");
         
-      m_transmittedDataTrace (contentObjectHeader, contentObject, CACHED, m_node->GetObject<Ccnx> (), incomingFace);
       incomingFace->Send (contentObject);
+      m_outData (contentObjectHeader, payload, true, incomingFace);
 
       // Set pruning timout on PIT entry (instead of deleting the record)
       m_pit->modify (m_pit->iterator_to (pitEntry),
@@ -481,6 +464,8 @@
                      ll::var(inFace) = ll::bind (&CcnxPitEntry::AddIncoming, ll::_1, incomingFace));
     }
 
+  NS_LOG_DEBUG ("IsRetx: " << isRetransmitted);
+
   // update PIT entry lifetime
   m_pit->modify (m_pit->iterator_to (pitEntry),
                  ll::bind (&CcnxPitEntry::UpdateLifetime, ll::_1,
@@ -504,9 +489,8 @@
   if (!isRetransmitted &&
       pitEntry.AreTherePromisingOutgoingFacesExcept (incomingFace))
     { // Suppress this interest if we're still expecting data from some other face
-      
-      // We are already expecting data later in future. Suppress the interest
-      m_droppedInterestsTrace (header, NDN_SUPPRESSED_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
+
+      m_dropInterests (header, SUPPRESSED, incomingFace);
       return;
     }
   
@@ -534,35 +518,13 @@
   // If no interests was propagated, then there is not other option for forwarding or
   // ForwardingStrategy failed to find it. 
   if (!propagated)
-    GiveUpInterest (pitEntry, header);
-}
-
-void
-CcnxL3Protocol::GiveUpInterest (const CcnxPitEntry &pitEntry,
-                                Ptr<CcnxInterestHeader> header)
-{
-  Ptr<Packet> packet = Create<Packet> ();
-  header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
-  packet->AddHeader (*header);
-
-  BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
     {
-      incoming.m_face->Send (packet->Copy ());
-
-      //m_droppedInterestsTrace (header, DROP_CONGESTION,
-      //                         m_node->GetObject<Ccnx> (), incomingFace);
+      NS_LOG_DEBUG ("Not propagated");
+      m_dropInterests (header, NO_FACES, incomingFace);
+      GiveUpInterest (pitEntry, header);
     }
-  // All incoming interests cannot be satisfied. Remove them
-  m_pit->modify (m_pit->iterator_to (pitEntry),
-                 ll::bind (&CcnxPitEntry::ClearIncoming, ll::_1));
-
-  // Set pruning timout on PIT entry (instead of deleting the record)
-  m_pit->modify (m_pit->iterator_to (pitEntry),
-                 ll::bind (&CcnxPitEntry::SetExpireTime, ll::_1,
-                           Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
 }
 
-
 // Processing ContentObjects
 void
 CcnxL3Protocol::OnData (const Ptr<CcnxFace> &incomingFace,
@@ -572,7 +534,7 @@
 {
     
   NS_LOG_FUNCTION (incomingFace << header << payload << packet);
-  m_receivedDataTrace (header, payload, m_node->GetObject<Ccnx> (), incomingFace);
+  m_inData (header, payload, incomingFace);
 
   // 1. Lookup PIT entry
   try
@@ -617,7 +579,10 @@
       BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
         {
           if (incoming.m_face != incomingFace)
-            incoming.m_face->Send (packet->Copy ());
+            {
+              incoming.m_face->Send (packet->Copy ());
+              m_outData (header, payload, false, incoming.m_face);
+            }
 
           // successfull forwarded data trace
         }
@@ -636,42 +601,70 @@
       //    (unsolicited data packets should not "poison" content store)
       
       //drop dulicated or not requested data packet
-      m_droppedDataTrace (header, payload, NDN_UNSOLICITED_DATA, m_node->GetObject<Ccnx> (), incomingFace);
+      m_dropData (header, payload, UNSOLICITED, incomingFace);
       return; // do not process unsoliced data packets
     }
 }
 
 void
-CcnxL3Protocol::SetBucketLeakInterval (Time interval)
+CcnxL3Protocol::GiveUpInterest (const CcnxPitEntry &pitEntry,
+                                Ptr<CcnxInterestHeader> header)
 {
-  m_bucketLeakInterval = interval;
-  
-  if (m_bucketLeakEvent.IsRunning ())
-    m_bucketLeakEvent.Cancel ();
+  Ptr<Packet> packet = Create<Packet> ();
+  header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
+  packet->AddHeader (*header);
 
-  m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
-                                           &CcnxL3Protocol::LeakBuckets, this);
-}
-
-Time
-CcnxL3Protocol::GetBucketLeakInterval () const
-{
-  return m_bucketLeakInterval;
-}
-
-void 
-CcnxL3Protocol::LeakBuckets ()
-{
-  // NS_LOG_FUNCTION (this);
-
-  BOOST_FOREACH (const Ptr<CcnxFace> &face, m_faces)
+  BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
     {
-      face->LeakBucket (m_bucketLeakInterval);
-    }
+      incoming.m_face->Send (packet->Copy ());
 
-  m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
-                                           &CcnxL3Protocol::LeakBuckets,
-                                           this);
+      m_outNacks (header, incoming.m_face);
+    }
+  // All incoming interests cannot be satisfied. Remove them
+  m_pit->modify (m_pit->iterator_to (pitEntry),
+                 ll::bind (&CcnxPitEntry::ClearIncoming, ll::_1));
+
+  // Remove also outgoing
+  m_pit->modify (m_pit->iterator_to (pitEntry),
+                 ll::bind (&CcnxPitEntry::ClearOutgoing, ll::_1));
+  
+  // Set pruning timout on PIT entry (instead of deleting the record)
+  m_pit->modify (m_pit->iterator_to (pitEntry),
+                 ll::bind (&CcnxPitEntry::SetExpireTime, ll::_1,
+                           Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
 }
 
+// void
+// CcnxL3Protocol::SetBucketLeakInterval (Time interval)
+// {
+//   m_bucketLeakInterval = interval;
+  
+//   if (m_bucketLeakEvent.IsRunning ())
+//     m_bucketLeakEvent.Cancel ();
+
+//   m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
+//                                            &CcnxL3Protocol::LeakBuckets, this);
+// }
+
+// Time
+// CcnxL3Protocol::GetBucketLeakInterval () const
+// {
+//   return m_bucketLeakInterval;
+// }
+
+// void 
+// CcnxL3Protocol::LeakBuckets ()
+// {
+//   // NS_LOG_FUNCTION (this);
+
+//   BOOST_FOREACH (const Ptr<CcnxFace> &face, m_faces)
+//     {
+//       face->LeakBucket (m_bucketLeakInterval);
+//     }
+
+//   m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
+//                                            &CcnxL3Protocol::LeakBuckets,
+//                                            this);
+// }
+
 } //namespace ns3
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 29500fc..d3e1b44 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -23,14 +23,11 @@
 
 #include <list>
 #include <vector>
-#include <stdint.h>
+
 #include "ns3/ptr.h"
 #include "ns3/net-device.h"
-#include "ns3/traced-callback.h"
 #include "ns3/nstime.h"
-#include "ns3/simulator.h"
 
-#include "ns3/ccnx-producer-helper.h"
 #include "ccnx-content-store.h"
 #include "ccnx-pit.h"
 #include "ccnx-fib.h"
@@ -87,36 +84,6 @@
   virtual ~CcnxL3Protocol ();
 
   /**
-   * \enum DropReason
-   * \brief Reason why a packet has been dropped.
-   */
-  enum DropReason 
-  {
-    NDN_DUPLICATE_INTEREST,  ///< \brief Duplicate Interest
-    NDN_SUPPRESSED_INTEREST, ///< \brief Suppressed Interest
-    NDN_UNSOLICITED_DATA,    ///< \brief Unsolicited ContentObject(duplicate?)
-    NDN_PIT_TIMER_EXPIRED,
-    INTERFACE_DOWN,          ///< \brief Interface is down
-
-    NACK_SUPPRESSED,
-    NACK_AFTER_SATISFIED,
-    NACK_NONDUPLICATE,
-
-    DROP_NO_ROUTE,   /**< No route to host */
-  };    
-
-  /**
-   * \enum DropReason
-   * \brief Description of where content object was originated
-   */
-  enum ContentObjectSource
-  {
-    APPLICATION,
-    FORWARDED,
-    CACHED
-  };
-
-  /**
    * \brief Assigns node to the CCNx stack
    *
    * \param node Simulation node
@@ -212,17 +179,17 @@
   CcnxL3Protocol(const CcnxL3Protocol &); ///< copy constructor is disabled
   CcnxL3Protocol &operator = (const CcnxL3Protocol &); ///< copy operator is disabled
 
-  /// \brief Set buckets leak interval
-  void
-  SetBucketLeakInterval (Time interval);
+  // /// \brief Set buckets leak interval
+  // void
+  // SetBucketLeakInterval (Time interval);
 
-  /// \brief Get buckets leak interval
-  Time
-  GetBucketLeakInterval () const;
+  // /// \brief Get buckets leak interval
+  // Time
+  // GetBucketLeakInterval () const;
   
-  /// \brief Periodically generate pre-calculated number of tokens (leak buckets)
-  void
-  LeakBuckets ();
+  // /// \brief Periodically generate pre-calculated number of tokens (leak buckets)
+  // void
+  // LeakBuckets ();
 
   void
   GiveUpInterest (const CcnxPitEntry &pitEntry,
@@ -240,32 +207,9 @@
   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)
-
-  Time    m_bucketLeakInterval;
-  EventId m_bucketLeakEvent;
   
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedInterestsTrace;
-  
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
-  
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 DropReason,
-                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedInterestsTrace;
-
-  TracedCallback<Ptr<const CcnxContentObjectHeader>,
-                 Ptr<const Packet>,/*payload*/
-                 Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedDataTrace;
-
-  TracedCallback<Ptr<const CcnxContentObjectHeader>,
-                  Ptr<const Packet>,/*payload*/
-                  ContentObjectSource,
-                  Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedDataTrace;
-  TracedCallback<Ptr<const CcnxContentObjectHeader>,
-                  Ptr<const Packet>,/*payload*/
-                  DropReason,
-                  Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedDataTrace;
+  // Time    m_bucketLeakInterval;
+  // EventId m_bucketLeakEvent;
 };
   
 } // Namespace ns3
diff --git a/model/ccnx-name-components.cc b/model/ccnx-name-components.cc
index d785423..893f7bb 100644
--- a/model/ccnx-name-components.cc
+++ b/model/ccnx-name-components.cc
@@ -50,6 +50,17 @@
   return m_prefix;
 }
 
+std::string
+CcnxNameComponents::GetLastComponent () const
+{
+  if (m_prefix.size () == 0)
+    {
+      return "";
+    }
+
+  return m_prefix.back ();
+}
+
 std::list<boost::reference_wrapper<const std::string> >
 CcnxNameComponents::GetSubComponents (size_t num) const
 {
@@ -88,7 +99,8 @@
   istream_iterator<char> eos; // end of stream
   
   std::string component = "";
-  for (istream_iterator<char> it (is); it != eos; it++)
+  istream_iterator<char> it (is);
+  for (; it != eos; it++)
     {
       if (*it == '/')
         {
@@ -102,6 +114,9 @@
   if (component != "")
       components.Add (component);
 
+  is.clear (); 
+  // NS_LOG_ERROR (components << ", bad: " << is.bad () <<", fail: " << is.fail ());
+  
   return is;
 }
 
diff --git a/model/ccnx-name-components.h b/model/ccnx-name-components.h
index 892ac4b..7f629dc 100644
--- a/model/ccnx-name-components.h
+++ b/model/ccnx-name-components.h
@@ -83,6 +83,9 @@
   const std::list<std::string> &
   GetComponents () const;
 
+  std::string
+  GetLastComponent () const;
+
   /**
    * \brief Get subcomponents of the name, starting with first component
    * @param[in] num Number of components to return. Valid value is in range [1, GetComponents ().size ()]
diff --git a/model/ccnx-pit-entry.cc b/model/ccnx-pit-entry.cc
index 76c7997..0cc6509 100644
--- a/model/ccnx-pit-entry.cc
+++ b/model/ccnx-pit-entry.cc
@@ -140,6 +140,7 @@
 void
 CcnxPitEntry::IncreaseAllowedRetxCount ()
 {
+  NS_LOG_ERROR (this);
   m_maxRetxCount++;
 }
 
diff --git a/model/ccnx-pit-entry.h b/model/ccnx-pit-entry.h
index c07eeda..12ffa91 100644
--- a/model/ccnx-pit-entry.h
+++ b/model/ccnx-pit-entry.h
@@ -195,6 +195,13 @@
   AddOutgoing (Ptr<CcnxFace> face);
 
   /**
+   * @brief Clear all incoming faces either after all of them were satisfied or NACKed
+   */
+  void
+  ClearOutgoing ()
+  { m_outgoing.clear (); }  
+  
+  /**
    * @brief Remove all references to face.
    * 
    * This method should be called before face is completely removed from the stack.
diff --git a/model/ccnx.cc b/model/ccnx.cc
index 21ec2bf..2e30e7f 100644
--- a/model/ccnx.cc
+++ b/model/ccnx.cc
@@ -23,6 +23,10 @@
 #include "ns3/boolean.h"
 
 #include "ccnx.h"
+#include "ccnx-face.h"
+#include "ccnx-forwarding-strategy.h"
+#include "ccnx-interest-header.h"
+#include "ccnx-content-object-header.h"
 
 namespace ns3 {
 
@@ -34,6 +38,29 @@
   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 38c2f74..8d565c1 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -23,6 +23,7 @@
 
 #include "ns3/object.h"
 #include "ns3/callback.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3 {
 
@@ -79,13 +80,6 @@
 class Ccnx : public Object
 {
 public:
-  enum ForwardingStrategy
-    { 
-      NDN_FLOODING = 1,
-      NDN_BESTROUTE = 2,
-      NDN_RANKING = 3 
-    };
-
   /**
    * \brief Interface ID
    *
@@ -94,48 +88,6 @@
   static TypeId GetTypeId ();
   virtual ~Ccnx ();
 
-  // /**
-  //  * \brief Send an Interest packet to a specified face
-  //  *
-  //  * \param face face where to send this packet
-  //  * \param header Interest header
-  //  * \param packet fully prepared CCNx packet to send
-  //  *
-  //  * Higher-level layers (forwarding strategy in particular) call this
-  //  * method to send a packet down the stack to the MAC and PHY layers.
-  //  */
-  // virtual void
-  // SendInterest (const Ptr<CcnxFace> &face,
-  //               const Ptr<const CcnxInterestHeader> &header,
-  //               const Ptr<Packet> &packet) = 0;
-
-  // /**
-  //  * \brief Send a ContentObject packet to a specified face
-  //  *
-  //  * \param face face where to send this packet
-  //  * \param header ContentObject header
-  //  * \param packet fully prepared CCNx packet to send
-  //  *
-  //  * Higher-level layers (forwarding strategy in particular) call this
-  //  * method to send a packet down the stack to the MAC and PHY layers.
-  //  */
-  // virtual void
-  // SendContentObject (const Ptr<CcnxFace> &face,
-  //                    const Ptr<const CcnxContentObjectHeader> &header,
-  //                    const Ptr<Packet> &packet) = 0;
-
-  // /**
-  //  * \brief Lower layers calls this method after demultiplexing
-  //  *
-  //  * Lower-layer-dependent implementation of CcnxFace will do actual work
-  //  * to set up demultiplexing and call this function as a callback
-  //  *
-  //  * \param face face from which packet came from
-  //  * \param p the packet
-  //  */
-  // virtual void
-  // Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p) = 0;
-
   /**
    * \brief Register a new forwarding strategy to be used by this Ccnx
    * stack
@@ -197,6 +149,64 @@
    */
   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
+    };
+  
+protected:
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  
+  // transmittedInterestTrace is inside ForwardingStrategy
+  
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_inInterests;
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 DropReason,
+                 Ptr<const CcnxFace> > m_dropInterests;
+  
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_outNacks;
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 Ptr<const CcnxFace> > m_inNacks;
+
+  TracedCallback<Ptr<const CcnxInterestHeader>,
+                 DropReason,
+                 Ptr<const CcnxFace> > m_dropNacks;
+
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                 bool /*from cache*/,
+                 Ptr<const CcnxFace> > m_outData;
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                 Ptr<const CcnxFace> > m_inData;
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                  DropReason,
+                  Ptr<const CcnxFace> > m_dropData;  
 };
 
 } // namespace ns3 
diff --git a/model/rocketfuel-weights-reader.cc b/model/rocketfuel-weights-reader.cc
index 448464e..4681e4e 100644
--- a/model/rocketfuel-weights-reader.cc
+++ b/model/rocketfuel-weights-reader.cc
@@ -39,8 +39,7 @@
 #include "ns3/uinteger.h"
 #include "ns3/ipv4-address.h"
 
-#include "ns3/constant-position-mobility-model.h"
-#include "ns3/random-variable.h"
+#include "ns3/mobility-model.h"
 
 #include <regex.h>
 
@@ -78,14 +77,16 @@
 NodeContainer
 RocketfuelWeightsReader::Read ()
 {
+  if (m_inputType == POSITIONS)
+    return AnnotatedTopologyReader::Read ();
+  
   ifstream topgen;
   topgen.open (GetFileName ().c_str ());
-  NodeContainer nodes;
         
   if ( !topgen.is_open () )
     {
       NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
-      return nodes;
+      return m_nodes;
     }
 
   map<string, set<string> > processedLinks; // to eliminate duplications
@@ -117,14 +118,12 @@
       if (fromNode == 0)
         {
           fromNode = CreateNode (from);
-          nodes.Add (fromNode);
         }
 
       Ptr<Node> toNode   = Names::Find<Node> (m_path, to);
       if (toNode == 0)
         {
           toNode = CreateNode (to);
-          nodes.Add (toNode);
         }
 
       Link *link;
@@ -142,12 +141,12 @@
         {
         case WEIGHTS:
           {
-            double metric = boost::lexical_cast<double> (attribute);
-            link->SetAttribute ("OSPF", boost::lexical_cast<string> (metric*2));
+            uint16_t metric = boost::lexical_cast<uint16_t> (attribute);
+            link->SetAttribute ("OSPF", boost::lexical_cast<string> (metric));
             break;
           }
         case LATENCIES:
-          link->SetAttribute ("Delay", attribute);
+          link->SetAttribute ("Delay", attribute+"ms");
           break;
         default:
           ; //
@@ -165,9 +164,9 @@
 
   if (!repeatedRun)
     {
-      NS_LOG_INFO ("Rocketfuel topology created with " << nodes.GetN () << " nodes and " << LinksSize () << " links");
+      NS_LOG_INFO ("Rocketfuel topology created with " << m_nodes.GetN () << " nodes and " << LinksSize () << " links");
     }
-  return nodes;
+  return m_nodes;
 }
 
 void
@@ -178,18 +177,22 @@
   SpringMobilityHelper::InstallSprings (LinksBegin (), LinksEnd ());
 }
 
+void
+RocketfuelWeightsReader::SavePositions (const std::string &file) const
+{
+  ofstream os (file.c_str (), ios::trunc);
+  os << "router\n";
+  
+  for (NodeContainer::Iterator node = m_nodes.Begin ();
+       node != m_nodes.End ();
+       node++)
+    {
+      std::string name = Names::FindName (*node);
+      Ptr<MobilityModel> mobility = (*node)->GetObject<MobilityModel> ();
+      Vector position = mobility->GetPosition ();
 
-// void
-// RocketfuelWeightsReader::Cheat (NodeContainer &nodes)
-// {
-//   double epsilon = 1;
-
-//   for (NodeContainer::Iterator i = nodes.Begin ();
-//        i != nodes.End ();
-//        i++)
-//     {
-      
-//     }  
-// }
+      os << name << "\t" << "unknown" << "\t" << -position.y << "\t" << position.x << "\n";
+    }
+}
 
 } /* namespace ns3 */
diff --git a/model/rocketfuel-weights-reader.h b/model/rocketfuel-weights-reader.h
index ecf4905..cf6a784 100644
--- a/model/rocketfuel-weights-reader.h
+++ b/model/rocketfuel-weights-reader.h
@@ -64,12 +64,13 @@
   enum
     {
       WEIGHTS,
-      LATENCIES
+      LATENCIES,
+      POSITIONS
     };
 
-  // void
-  // Cheat (NodeContainer &nodes);
-
+  void
+  SavePositions (const std::string &file) const;
+  
 private:
   RocketfuelWeightsReader (const RocketfuelWeightsReader&);
   RocketfuelWeightsReader& operator= (const RocketfuelWeightsReader&);
diff --git a/utils/ipv4-global-routing-ordered-nexthops.cc b/utils/ipv4-global-routing-ordered-nexthops.cc
index a01c044..f206a69 100644
--- a/utils/ipv4-global-routing-ordered-nexthops.cc
+++ b/utils/ipv4-global-routing-ordered-nexthops.cc
@@ -110,9 +110,18 @@
 {
   NS_LOG_FUNCTION (this << dest << oif);
 
-  Ipv4AddressTrieMap::const_iterator longest_prefix_map = m_routes.longest_prefix_match (dest);
+  // Cheating with lookups. Need to redesign Trie
+  Ipv4AddressTrieMap::const_iterator longest_prefix_map;
+  Ipv4Mask mask ("255.255.255.255");
+  do {
+    NS_LOG_DEBUG ("Try mask " << mask);
+    longest_prefix_map = m_routes.longest_prefix_match (dest.CombineMask (mask));
+    mask = Ipv4Mask (mask.Get () << 8);
+  } while (longest_prefix_map == m_routes.end () && !mask.IsEqual (Ipv4Mask::GetZero ()));
+
   if (longest_prefix_map == m_routes.end ())
     {
+      NS_LOG_LOGIC ("Route not found...");
       return 0;
     }
 
diff --git a/utils/ipv4-global-routing-unordered-nexthops.cc b/utils/ipv4-global-routing-unordered-nexthops.cc
index 0fdce0b..a4f3660 100644
--- a/utils/ipv4-global-routing-unordered-nexthops.cc
+++ b/utils/ipv4-global-routing-unordered-nexthops.cc
@@ -141,9 +141,18 @@
   NS_ASSERT_MSG (entryNum < m_numLogicalEntries,
                "Number of requested logical entry should be smaller than total number of logical entries");
   
-  Ipv4AddressTrieMap::const_iterator longest_prefix_map = m_routes.longest_prefix_match (dest);
+  // Cheating with lookups. Need to redesign Trie
+  Ipv4AddressTrieMap::const_iterator longest_prefix_map;
+  Ipv4Mask mask ("255.255.255.255");
+  do {
+    NS_LOG_DEBUG ("Try mask " << mask);
+    longest_prefix_map = m_routes.longest_prefix_match (dest.CombineMask (mask));
+    mask = Ipv4Mask (mask.Get () << 8);
+  } while (longest_prefix_map == m_routes.end () && !mask.IsEqual (Ipv4Mask::GetZero ()));
+
   if (longest_prefix_map == m_routes.end ())
     {
+      NS_LOG_LOGIC ("Route not found...");
       return 0;
     }
 
diff --git a/utils/spring-mobility-model.cc b/utils/spring-mobility-model.cc
index 5fb968b..170b428 100644
--- a/utils/spring-mobility-model.cc
+++ b/utils/spring-mobility-model.cc
@@ -33,6 +33,9 @@
 NS_OBJECT_ENSURE_REGISTERED (SpringMobilityModel);
 
 double SpringMobilityModel::m_totalKineticEnergy = 0.0;
+bool SpringMobilityModel::m_stable = false;
+EventId SpringMobilityModel::m_updateEvent;
+double SpringMobilityModel::m_epsilon = 100.0;
 
 const double COLOUMB_K = 200; 
 
@@ -41,10 +44,10 @@
   static TypeId tid = TypeId ("ns3::SpringMobilityModel")
     .SetParent<MobilityModel> ()
     .AddConstructor<SpringMobilityModel> ()
-    .AddAttribute ("Epsilon", "Bound for kinetic energy when system is considered stable",
-                   DoubleValue (1000.0),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_epsilon),
-                   MakeDoubleChecker<double> ())
+    // .AddAttribute ("Epsilon", "Bound for kinetic energy when system is considered stable",
+    //                DoubleValue (100.0),
+    //                MakeDoubleAccessor (&SpringMobilityModel::m_epsilon),
+    //                MakeDoubleChecker<double> ())
     .AddAttribute ("NodeMass", "Node mass",
                    DoubleValue (10),
                    MakeDoubleAccessor (&SpringMobilityModel::m_nodeMass),
@@ -62,7 +65,7 @@
                    MakeDoubleAccessor (&SpringMobilityModel::m_springConstant),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("DampingFactor", "Dumping factor",
-                   DoubleValue (0.6),
+                   DoubleValue (0.8),
                    MakeDoubleAccessor (&SpringMobilityModel::m_dampingFactor),
                    MakeDoubleChecker<double> ())
     ;
@@ -73,7 +76,6 @@
 SpringMobilityModel::SpringMobilityModel ()
   : m_position (0,0,0)
   , m_velocity (0,0,0)
-  , m_stable (false)
 {
 }
 
@@ -90,15 +92,35 @@
 void
 SpringMobilityModel::DoStart ()
 {
-  // m_updateEvent = Simulator::Schedule (Seconds(0.05), &SpringMobilityModel::Update, this);
+  if (!m_updateEvent.IsRunning ())
+    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
+}
 
-  // Simulator::Schedule (Seconds(2.0), &SpringMobilityModel::Test, this);
+void
+SpringMobilityModel::UpdateAll ()
+{
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
+      if (model != 0)
+        model->Update ();
+    }
+
+  if (m_totalKineticEnergy < m_epsilon)
+    {
+      m_stable = true;
+      NS_LOG_INFO ("Stabilized with " << m_totalKineticEnergy);
+    }
+  else
+    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);  
 }
 
 void
 SpringMobilityModel::Update () const
 {
-  // NS_LOG_FUNCTION (this << m_stable << m_position << m_velocity);
+  NS_LOG_FUNCTION (this << m_stable << m_position << m_velocity);
   if (m_stable) return;
   Time now = Simulator::Now ();
 
@@ -152,22 +174,13 @@
   velocityValue = CalculateDistance (m_velocity, Vector(0,0,0)); 
   m_totalKineticEnergy += m_nodeMass * velocityValue * velocityValue;
 
-  if (m_totalKineticEnergy < m_epsilon)
-    {
-      m_stable = true;
-      NS_LOG_INFO ("Stabilized with " << m_totalKineticEnergy);
-    }
-
   NotifyCourseChange ();
-  // m_updateEvent = Simulator::Schedule (Seconds(0.05), &SpringMobilityModel::Update, this);
 }
 
 Vector
 SpringMobilityModel::DoGetPosition (void) const
 {
   // NS_LOG_FUNCTION (this << m_position);
-  Update ();
-  
   return m_position;
 }
 void 
@@ -178,6 +191,19 @@
 
   NotifyCourseChange ();
   m_stable = false;
+
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
+      if (model != 0)
+        model->m_lastTime = Simulator::Now ();
+    }
+  
+  if (!m_updateEvent.IsRunning ())
+    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
 }
 Vector
 SpringMobilityModel::DoGetVelocity (void) const
diff --git a/utils/spring-mobility-model.h b/utils/spring-mobility-model.h
index 553ab9d..700c994 100644
--- a/utils/spring-mobility-model.h
+++ b/utils/spring-mobility-model.h
@@ -68,8 +68,11 @@
   void 
   Update (void) const;
 
+  static void
+  UpdateAll ();
+
 private:
-  double m_epsilon;
+  static double m_epsilon;
 
   double m_nodeMass;
   double m_nodeCharge;
@@ -78,14 +81,13 @@
   double m_dampingFactor;
 
   static double m_totalKineticEnergy;  
+  static bool m_stable;
+  static EventId m_updateEvent;
   
   mutable Vector m_position;
   mutable Vector m_velocity;
-  mutable bool m_stable;
   mutable Time m_lastTime;
 
-  EventId m_updateEvent;
-
   std::list<Ptr<MobilityModel> > m_springs;
 };
 
diff --git a/wscript b/wscript
index d0c569c..5b6c0d4 100644
--- a/wscript
+++ b/wscript
@@ -48,19 +48,22 @@
     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'])
 
     headers.source = [
         "helper/ccnx-stack-helper.h",
-        "helper/ccnx-producer-helper.h",
-        "helper/ccnx-consumer-helper.h",
+        "helper/ccnx-app-helper.h",
         "helper/ccnx-header-helper.h",
+        "helper/ccnx-trace-helper.h",
+        "helper/tracers/ipv4-app-tracer.h",
+        "helper/tracers/ccnx-app-tracer.h",
+        "helper/tracers/ccnx-l3-tracer.h",
+        "helper/ccnx-face-container.h",
 
         "apps/ccnx-app.h",
-        # "apps/ccnx-consumer.h",
-        # "apps/ccnx-producer.h",
 
         "model/hash-helper.h",
         "model/ccnx.h",
@@ -70,18 +73,13 @@
         "model/ccnx-content-object-header.h",
         "model/ccnx-name-components.h",
         "model/ccnx-fib.h",
-        
-        "helper/ccnx-face-container.h",
+
+        "utils/spring-mobility-model.h",
+        "utils/spring-mobility-helper.h",
+
         "model/rocketfuel-weights-reader.h",
         "model/annotated-topology-reader.h",
         ]
-    # headers.source = bld.path.ant_glob(['model/*.h', 'apps/*.h', 
-    #                       'helper/*.h',
-    #                       'helper/ccnb-parser/*.h',
-    #                       'helper/ccnb-parser/visitors/*.h',
-    #                       'helper/ccnb-parser/syntax-tree/*.h'])
-
-    # headers.source = [x.path_from(bld.path) for x in headers.source]
 
     tests.source = bld.path.ant_glob('test/*.cc');
 
@@ -95,9 +93,6 @@
         obj = bld.create_ns3_program('ccnx-grid', ['NDNabstraction', 'point-to-point-layout'])
         obj.source = 'examples/ccnx-grid.cc'
 
-        obj = bld.create_ns3_program('syntactic-topology', ['NDNabstraction', 'point-to-point-layout'])
-        obj.source = 'examples/syntactic-topology-ndnabstraction.cc'
-
         obj = bld.create_ns3_program('annotated-topology', ['NDNabstraction', 'point-to-point-layout'])
         obj.source = 'examples/annotated-topology-read-example.cc'
 
@@ -116,6 +111,12 @@
         obj = bld.create_ns3_program('ccnx-synthetic-topology', ['NDNabstraction'])
         obj.source = 'examples/synthetic-topology.cc'
 
+        obj = bld.create_ns3_program('congestion-pop', ['NDNabstraction'])
+        obj.source = 'examples/congestion-pop.cc'
+
+        obj = bld.create_ns3_program('congestion-tcp-pop', ['NDNabstraction'])
+        obj.source = 'examples/congestion-tcp-pop.cc'
+
         #obj = bld.create_ns3_program('congestion-pop', ['NDNabstraction'])
         #obj.source = 'examples/congestion-pop.cc'
         
@@ -131,22 +132,4 @@
         #obj = bld.create_ns3_program('blackhole-abilene', ['NDNabstraction'])
         #obj.source = 'examples/blackhole-abilene.cc'
 
-    #     for path in ["examples"]:
-    #         anode = bld.path.find_dir (path)
-    #         if not anode or not anode.is_child_of(bld.srcnode):
-    #             raise Utils.WscriptError("Unable to use '%s' - either because \
-    #             it's not a relative path"", or it's not child of \
-    #            '%s'."%(name,bld.srcnode))
-    #         bld.rescan(anode)
-    #         for filename in bld.cache_dir_contents[anode.id]:
-    #             if filename.startswith('.') or not filename.endswith(".cc"):
-    #                 continue
-    #             name = filename[:-len(".cc")]
-    #             obj = bld.create_ns3_program(name, ['NDNabstraction'])
-    #             obj.path = obj.path.find_dir (path)
-    #             obj.source = filename
-    #             obj.target = name
-    #             obj.name = obj.target
-    #             obj.uselib = 'BOOST BOOST_IOSTREAMS'
-
     bld.ns3_python_bindings()