diff --git a/examples/blackhole-abilene.cc b/examples/blackhole-abilene.cc
index 8b13789..8e71033 100644
--- a/examples/blackhole-abilene.cc
+++ b/examples/blackhole-abilene.cc
@@ -1 +1 @@
-
+//we don't need it?
diff --git a/examples/blackhole-sprint.cc b/examples/blackhole-sprint.cc
index 8b13789..f97be29 100644
--- a/examples/blackhole-sprint.cc
+++ b/examples/blackhole-sprint.cc
@@ -1 +1,309 @@
+/* -*-  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 <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 ("BlackholeSprint");
+
+void PrintTime ()
+{
+  cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+
+class Experiment
+{
+public:
+  Experiment ()
+  : m_reader ("/sprint") { }
+
+  void
+  ConfigureTopology ()
+  {
+    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");
+
+    m_reader.SetFileName (positions);
+    m_reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+    m_reader.Read ();
+  
+    m_reader.SetFileName (weights);
+    m_reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
+    m_reader.Read ();
+
+    m_reader.SetFileName (latencies);
+    m_reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
+    m_reader.Read ();
+    
+    m_reader.Commit ();
+    NS_ASSERT_MSG (m_reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+    
+    NS_LOG_INFO("Nodes = " << m_reader.GetNodes ().GetN());
+    NS_LOG_INFO("Links = " << m_reader.LinksSize ());
+  
+    // ------------------------------------------------------------
+    // -- Read topology data.
+    // --------------------------------------------
+        
+    InternetStackHelper stack;
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    stack.Install (m_reader.GetNodes ());
+
+    m_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 ();
+    
+    m_rand = UniformVariable (0, m_reader.GetNodes ().GetN());
+    m_linkRand = UniformVariable(0, m_reader.LinksSize());
+  }
+
+  void
+  ConfigureRouting ()
+  {
+    CcnxStackHelper ccnxHelper;
+    // // Populate FIB based on IPv4 global routing controller
+    ccnxHelper.InstallFakeGlobalRoutes ();
+    ccnxHelper.InstallRoutesToAll ();
+  }
+
+public:  
+  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";
+  }
+
+  //We are creating 10 pairs of producer-hijacker and everybody else is a consumer
+  ApplicationContainer
+  AddApplications(uint32_t numOfPairs)
+  {
+    NS_LOG_INFO("Adding applications");
+    ApplicationContainer apps;
+    
+    list<uint32_t > usedNodes;
+    list<uint32_t >::iterator listIterator;
+    list<uint32_t >::iterator listIterator2;
+    
+    uint32_t producerNodeId;
+    uint32_t hijackerNodeId;
+
+    for(uint32_t pairCount = 0; pairCount < numOfPairs; pairCount++)
+      {
+        NS_LOG_INFO("pairCount = "<<pairCount);
+        while(true)
+          {
+            producerNodeId = m_rand.GetValue ();
+            hijackerNodeId = m_rand.GetValue ();
+        
+            bool unique = true; 
+            for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator)
+              {
+                if((*listIterator == producerNodeId) || (*listIterator == hijackerNodeId))
+                  {
+                    NS_LOG_INFO("NonUnique");
+                    unique = false;
+                  }
+              }
+        
+            if(unique == true)
+              {
+                usedNodes.push_back(producerNodeId);
+                usedNodes.push_back(hijackerNodeId);
+                break;
+              }
+          }
+      
+        NS_LOG_INFO("Producer #" << producerNodeId);
+        Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (producerNodeId));
+        CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+        producerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
+        
+        apps.Add(producerHelper.Install (node1));
+
+        NS_LOG_INFO("Hijacker # "<<hijackerNodeId);
+        Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (hijackerNodeId));
+        CcnxAppHelper hijackerHelper ("ns3::CcnxHijacker");
+        hijackerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
+        
+        apps.Add(hijackerHelper.Install (node1));
+        
+        /*NS_LOG_INFO("Consumers");
+        for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
+          {
+            //NS_LOG_INFO("j="<<j);
+            bool consumer = true;
+            for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator)
+              {
+                if(*listIterator == j)
+                {
+                  consumer = false;
+                  NS_LOG_INFO(j<<" CANNOT be CONSUMER");
+                  break;
+                }
+              }
+        
+            if(consumer == true)
+              {
+                Ptr<Node> node3 = Names::Find<Node> ("/sprint", lexical_cast<string> (j));
+        
+                CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+                consumerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
+                consumerHelper.SetAttribute ("MeanRate", StringValue ("1Kbps"));
+                consumerHelper.SetAttribute ("Size", StringValue ("2"));  
+        
+                apps.Add(consumerHelper.Install (node3));
+              }
+          }*/
+        }
+      
+      NS_LOG_INFO("Consumers");
+      for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator,++listIterator)
+        {
+          for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
+          {
+            //NS_LOG_INFO("j="<<j);
+            bool consumer = true;
+            for(listIterator2=usedNodes.begin(); listIterator2 != usedNodes.end(); ++listIterator2)
+              {
+                if(*listIterator2 == j)
+                {
+                  consumer = false;
+                  NS_LOG_INFO(j<<" CANNOT be a CONSUMER");
+                  break;
+                }
+              }
+        
+            if(consumer == true)
+              {
+                Ptr<Node> node3 = Names::Find<Node> ("/sprint", lexical_cast<string> (j));
+                Ptr<Node> node4 = Names::Find<Node> ("/sprint", lexical_cast<string> (*listIterator));
+
+                CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+                NS_LOG_INFO("Node = " << *listIterator);
+                consumerHelper.SetPrefix ("/" + lexical_cast<string> (node4->GetId ()));
+                consumerHelper.SetAttribute ("MeanRate", StringValue ("1Kbps"));
+                consumerHelper.SetAttribute ("Size", StringValue ("2"));  
+        
+                apps.Add(consumerHelper.Install (node3));
+              }
+          }
+        }
+      
+      
+    return apps;
+  }
+
+  UniformVariable m_rand;
+  UniformVariable m_linkRand;
+  
+private:
+  RocketfuelWeightsReader m_reader;
+};
+
+int 
+main (int argc, char *argv[])
+{
+  cout << "Begin blackhole scenario\n";
+  
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("2Mbps"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("100"));
+
+  Time finishTime = Seconds (20.0);
+  
+   
+  CommandLine cmd;
+  cmd.AddValue ("finish", "Finish time", finishTime);
+  cmd.Parse (argc, argv);
+
+  Experiment experiment;
+
+  for (uint32_t i = 0; i < 80; i++)
+    {
+      Config::SetGlobal ("RngRun", IntegerValue (i));
+      cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+
+      Experiment experiment;
+      cout << "Run " << i << endl;
+      
+      string prefix = "run-" + lexical_cast<string> (i) + "-";
+  
+      experiment.ConfigureTopology ();
+      ApplicationContainer apps = experiment.AddApplications (10);
+      experiment.ConfigureRouting ();
+      
+      /*ApplicationContainer apps = experiment.AddApplications ();
+
+      for (uint32_t i = 0; i < apps.GetN () / 2; i++) 
+        {
+          cout << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+               << " to "  << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+          cout << "\n";
+        }
+      */
+      
+      //tracing
+      CcnxTraceHelper traceHelper;
+      traceHelper.EnableRateL3All (prefix + "rate-trace.log");
+      traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
+      
+      experiment.Run (finishTime);
+    }
+
+  cout << "Finish blackhole scenario\n";
+  return 0;
+}
diff --git a/examples/link-failure-abilene.cc b/examples/link-failure-abilene.cc
index f118b04..4a94585 100644
--- a/examples/link-failure-abilene.cc
+++ b/examples/link-failure-abilene.cc
@@ -18,154 +18,185 @@
  * 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/animation-interface.h"
-// #include "ns3/ccnx-l3-protocol.h"
+#include "ns3/random-variable.h"
 
 #include <iostream>
 #include <sstream>
-#include "ns3/annotated-topology-reader.h"
-#include "../utils/spring-mobility-helper.h"
+#include <map>
+#include <list>
+#include <set>
+#include "ns3/rocketfuel-topology-reader.h"
 
-#include "ns3/config-store.h"
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
 
 using namespace ns3;
 using namespace std;
+using namespace boost;
 
-NS_LOG_COMPONENT_DEFINE ("CcnxLinkFailureAbilene");
+NS_LOG_COMPONENT_DEFINE ("LinkFailureSprint");
 
+void PrintTime ()
+{
+  cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+  Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+
+class Experiment
+{
+public:
+  Experiment ()
+  : m_reader ("/abilene", 2.0) { }
+
+  void
+  ConfigureTopology ()
+  {
+    string input ("./src/NDNabstraction/examples/abilene-topology.txt");
+    string strategy ("ns3::CcnxBestRouteStrategy");
+    // string strategy ("ns3::CcnxFloodingStrategy");
+  
+   
+    m_reader.SetFileName (input);
+    
+    NodeContainer nodes = m_reader.Read ();
+    
+    if (m_reader.LinksSize () == 0)
+    {
+      NS_LOG_ERROR ("Problems reading the topology file. Failing.");
+      return;
+    }
+
+    NS_ASSERT_MSG (m_reader.LinksSize () != 0, "Problems reading the topology file. Failing.");    
+    NS_LOG_INFO("Nodes = " << m_reader.GetNodes ().GetN());
+    NS_LOG_INFO("Links = " << m_reader.LinksSize ());
+  
+    // ------------------------------------------------------------
+    // -- Read topology data.
+    // --------------------------------------------
+        
+    InternetStackHelper stack;
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    stack.Install (m_reader.GetNodes ());
+
+    m_reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+
+    // 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 ();
+
+    // // Populate FIB based on IPv4 global routing controller
+    ccnxHelper.InstallFakeGlobalRoutes ();
+    ccnxHelper.InstallRoutesToAll ();
+
+    m_rand = UniformVariable (0, m_reader.GetNodes ().GetN());
+    m_linkRand = UniformVariable(0, m_reader.LinksSize());
+  }
+
+public:  
+  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";
+  }
+
+  //We are creating "everybody-to-everybody" usage pattern
+  ApplicationContainer
+  AddApplications()
+  {
+    ApplicationContainer apps;
+    for(uint32_t i =0; i<m_reader.GetNodes().GetN(); i++)
+    {
+      Ptr<Node> node1 = Names::Find<Node> ("/abilene", lexical_cast<string> (i));
+      CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+      producerHelper.SetPrefix ("/" + lexical_cast<string> (i));
+        
+      apps.Add(producerHelper.Install (node1));
+          
+      for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
+      {
+        if(i==j)
+          continue;
+        
+        Ptr<Node> node2 = Names::Find<Node> ("/abilene", lexical_cast<string> (j));
+        
+        CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+        consumerHelper.SetPrefix ("/" + lexical_cast<string> (i));
+        consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
+        consumerHelper.SetAttribute ("Size", StringValue ("2"));  
+        
+        apps.Add(consumerHelper.Install (node2));
+      }
+    }
+    return apps;
+  }
+  
+  UniformVariable m_rand;
+  UniformVariable m_linkRand;
+  
+private:
+  AnnotatedTopologyReader m_reader;
+};
 
 int 
 main (int argc, char *argv[])
 {
-  // Packet::EnableChecking();
-  // Packet::EnablePrinting();
-  string input ("./src/NDNabstraction/examples/abilene-topology.txt");
+  cout << "Begin link failure scenario\n";
+  
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("2Mbps"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("100"));
 
   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);
-    
-  ConfigStore config;
-  config.ConfigureDefaults ();
-    
-  // ------------------------------------------------------------
-  // -- Read topology data.
-  // --------------------------------------------
-    
-  AnnotatedTopologyReader reader ("/abilene");
-  reader.SetMobilityModel ("ns3::SpringMobilityModel");
-  reader.SetFileName (input);
-    
-  NodeContainer nodes = reader.Read ();
-    
-  if (reader.LinksSize () == 0)
+
+  Experiment experiment;
+
+  for (uint32_t i = 0; i < 100; i++)
     {
-      NS_LOG_ERROR ("Problems reading the topology file. Failing.");
-      return -1;
+  
+      experiment.ConfigureTopology ();
+      ApplicationContainer apps = experiment.AddApplications ();
+
+      for (uint32_t i = 0; i < apps.GetN () / 2; i++) 
+        {
+          cout << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+               << " to "  << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+          cout << "\n";
+        }
+  
+      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");
+
+      experiment.Run (finishTime);
     }
 
-  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> ("/abilene", "ATLAng"));
-    
-  // CcnxProducerHelper producerHelper ("/5",1024);
-  // ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "IPLSng"));
-
-  // // Populate FIB based on IPv4 global routing controller
-  // ccnxHelper.InstallFakeGlobalRoutes ();
-  // ccnxHelper.InstallRouteTo (Names::Find<Node> ("/abilene", "IPLSng"));
-
-  // Simulator::Schedule (Seconds (1.0), PrintFIBs);
-  // PrintFIBs ();
-
-  // 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);
+  cout << "Finish link failure scenario\n";
   return 0;
 }
diff --git a/examples/link-failure-sprint.cc b/examples/link-failure-sprint.cc
index dfbbf04..421f134 100644
--- a/examples/link-failure-sprint.cc
+++ b/examples/link-failure-sprint.cc
@@ -26,6 +26,8 @@
 #include "ns3/point-to-point-grid.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/random-variable.h"
+#include "ns3/ccnx-l3-protocol.h"
+#include "ns3/topology-reader.h"
 
 #include <iostream>
 #include <sstream>
@@ -54,35 +56,37 @@
 class Experiment
 {
 public:
+  Experiment ()
+  : m_reader ("/sprint") { }
+
   void
   ConfigureTopology ()
   {
+    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");
-    string strategy  ("ns3::CcnxBestRouteStrategy");
-    // string strategy ("ns3::CcnxFloodingStrategy");
   
-    RocketfuelWeightsReader reader ("/sprint");
-    m_reader = reader;
-    
-    reader.SetFileName (positions);
-    reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
-    reader.Read ();
-  
-    reader.SetFileName (weights);
-    reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
-    reader.Read ();
+    //RocketfuelWeightsReader reader ("/sprint");
 
-    reader.SetFileName (latencies);
-    reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
-    reader.Read ();
+    m_reader.SetFileName (positions);
+    m_reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+    m_reader.Read ();
+  
+    m_reader.SetFileName (weights);
+    m_reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);    
+    m_reader.Read ();
+
+    m_reader.SetFileName (latencies);
+    m_reader.SetFileType (RocketfuelWeightsReader::LATENCIES);    
+    m_reader.Read ();
     
-    reader.Commit ();
-    NS_ASSERT_MSG (reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+    m_reader.Commit ();
+    NS_ASSERT_MSG (m_reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
     
-    NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
-    NS_LOG_INFO("Links = " << reader.LinksSize ());
+    NS_LOG_INFO("Nodes = " << m_reader.GetNodes ().GetN());
+    NS_LOG_INFO("Links = " << m_reader.LinksSize ());
   
     // ------------------------------------------------------------
     // -- Read topology data.
@@ -91,23 +95,29 @@
     InternetStackHelper stack;
     Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
     stack.SetRoutingHelper (ipv4RoutingHelper);
-    stack.Install (reader.GetNodes ());
+    stack.Install (m_reader.GetNodes ());
 
-    reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
-
+    m_reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+    
     // Install CCNx stack
     NS_LOG_INFO ("Installing CCNx stack");
     CcnxStackHelper ccnxHelper;
-    ccnxHelper.SetForwardingStrategy (strategy);
+    ccnxHelper.SetForwardingStrategy ("ns3::CcnxBestRouteStrategy");
     ccnxHelper.EnableLimits (true, Seconds(0.1));
     ccnxHelper.SetDefaultRoutes (false);
     ccnxHelper.InstallAll ();
+    
+    m_rand = UniformVariable (0, m_reader.GetNodes ().GetN());
+    //m_linkRand = UniformVariable(0, m_reader.LinksSize());
+  }
 
+  void
+  ConfigureRouting ()
+  {
+    CcnxStackHelper ccnxHelper;
     // // Populate FIB based on IPv4 global routing controller
     ccnxHelper.InstallFakeGlobalRoutes ();
     ccnxHelper.InstallRoutesToAll ();
-
-    m_rand = UniformVariable (0, reader.GetNodes ().GetN());
   }
 
 public:  
@@ -122,131 +132,164 @@
     cout << "Done.\n";
   }
 
+  void
+  FailLinks(double threshold)
+  {
+    NS_LOG_INFO("Failing links");
+    m_linkRand = UniformVariable(0, 1.0);
+    double probability = 0.0;
+    
+    BOOST_FOREACH (const TopologyReader::Link &link, m_reader.GetLinks())
+      {
+        probability = m_linkRand.GetValue();
+        NS_LOG_INFO ("Probability = " << probability);
+        
+        if(probability <= threshold)
+          {
+            Ptr<Node> fromNode = link.GetFromNode ();
+            Ptr<Node> toNode = link.GetToNode ();
+            NS_LOG_INFO("From node id = " << fromNode->GetId());
+            NS_LOG_INFO("To node id = " << toNode->GetId());
+            
+            Ptr<CcnxL3Protocol> fromCcnx = fromNode->GetObject<CcnxL3Protocol> ();
+            Ptr<CcnxL3Protocol> toCcnx = toNode->GetObject<CcnxL3Protocol> (); 
+          
+            Ptr<NetDevice> fromDevice = link.GetFromNetDevice ();
+            Ptr<NetDevice> toDevice = link.GetToNetDevice ();
+          
+            Ptr<CcnxFace> fromFace = fromCcnx->GetFaceByNetDevice (fromDevice);
+            Ptr<CcnxFace> toFace = toCcnx->GetFaceByNetDevice (toDevice);
+          
+            NS_LOG_INFO("From face id = " << fromFace->GetId());
+            NS_LOG_INFO("To face id = " << toFace->GetId());
+            fromFace->SetUp (false);
+            toFace->SetUp (false);
+            
+            NS_LOG_INFO(fromFace->IsUp());
+            NS_LOG_INFO(toFace->IsUp());
+          }
+
+      }
+    /*
+    uint32_t nodeId = m_rand.GetValue ();
+    Ptr<Node> node = Names::Find<Node> ("/sprint", lexical_cast<string> (nodeId));
+    
+    Ptr<CcnxL3Protocol> ccnx = node->GetObject<CcnxL3Protocol> ();
+    UniformVariable faceRandom = UniformVariable (0, ccnx->GetNFaces ());
+    uint32_t faceId = faceRandom.GetValue();
+    Ptr<CcnxFace> face = ccnx->GetFace (faceId);
+    face->SetUp(false);
+    */
+  }
+
   //We are creating "everybody-to-everybody" usage pattern
   ApplicationContainer
   AddApplications()
   {
+    NS_LOG_INFO("Adding applications");
+    NS_LOG_INFO("GetN = " << m_reader.GetNodes().GetN());
+    
     ApplicationContainer apps;
-    for(int i =0; i<reader.GetNodes().GetN(); i++;)
+    for(uint32_t i = 0; i<m_reader.GetNodes().GetN(); i++)
     {
-      Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (node1_num));
+      NS_LOG_INFO("i="<<i);
+      Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (i));
+        
       CcnxAppHelper producerHelper ("ns3::CcnxProducer");
-      producerHelper.SetPrefix ("/" + lexical_cast<string> (i));
+      producerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
         
       apps.Add(producerHelper.Install (node1));
-          
-      for(int j = 0; j<reader.GetNodes().GetN();j++)
+            
+      for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
       {
+        NS_LOG_INFO("j="<<j);
         if(i==j)
           continue;
         
-        Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (node2_num));
-        
+        Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (j));
+          
         CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
-        consumerHelper.SetPrefix ("/" + lexical_cast<string> (i));
-        consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+        consumerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
+        consumerHelper.SetAttribute ("MeanRate", StringValue ("1Kbps"));
         consumerHelper.SetAttribute ("Size", StringValue ("2"));  
         
         apps.Add(consumerHelper.Install (node2));
       }
     }
-    return apps;
-  }
-
-  ApplicationContainer
-  AddRandomApplications (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 ("2"));
-
-        CcnxAppHelper producerHelper ("ns3::CcnxProducer");
-        producerHelper.SetPrefix ("/" + lexical_cast<string> (node2->GetId ()));
-        
-        apps.Add
-          (consumerHelper.Install (node1));
-
-        apps.Add
-          (producerHelper.Install (node2));
-
-        createdStreams ++;
-      }
-
     return apps;
   }
 
-
   UniformVariable m_rand;
-  
-private:
+  UniformVariable m_linkRand;
   RocketfuelWeightsReader m_reader;
 };
 
 int 
 main (int argc, char *argv[])
 {
-  cout << "Begin congestion-pop scenario\n";
+  cout << "Begin link failure scenario\n";
   
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("10Mbps"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("100"));
 
-  Time finishTime = Seconds (20.0);
+  Time finishTime1 = Seconds (5.0);
+  Time finishTime2 = Seconds (20.0);
 
   CommandLine cmd;
-  cmd.AddValue ("finish", "Finish time", finishTime);
+  cmd.AddValue ("finish", "Finish time", finishTime1);
   cmd.Parse (argc, argv);
 
   Experiment experiment;
 
-  for (uint32_t i = 0; i < 100; i++)
+  for (uint32_t i = 0; i < 80; i++)
     {
+      Config::SetGlobal ("RngRun", IntegerValue (i));
+      cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+
+      Experiment experiment;
+      cout << "Run " << i << endl;
+      
+      string prefix = "run-" + lexical_cast<string> (i) + "-";
   
+      //before link failure
       experiment.ConfigureTopology ();
       ApplicationContainer apps = experiment.AddApplications ();
+      experiment.ConfigureRouting ();
+      //tracing
+      //...
+      //experiment.Run (finishTime1);
+      
+      //after link failure 
+      experiment.FailLinks(0.1);
+      
+      //tracing
+      CcnxTraceHelper traceHelper;
+      traceHelper.EnableRateL3All (prefix + "rate-trace.log");
+      traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
+      //...
+      experiment.Run (finishTime2);
 
+/*
       for (uint32_t i = 0; i < apps.GetN () / 2; i++) 
         {
           cout << "From " << apps.Get (i*2)->GetNode ()->GetId ()
                << " to "  << apps.Get (i*2 + 1)->GetNode ()->GetId ();
           cout << "\n";
-        }
+        }*/
   
-      CcnxTraceHelper traceHelper;
+      //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");
+      //traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", "consumers-seqs.log");
 
-      experiment.Run (finishTime);
+      
     }
 
-  cout << "Finish congestion-pop scenario\n";
+  cout << "Finish link failure scenario\n";
   return 0;
 }
diff --git a/wscript b/wscript
index 5b6c0d4..8e7a186 100644
--- a/wscript
+++ b/wscript
@@ -126,8 +126,8 @@
         #obj = bld.create_ns3_program('link-failure-abilene', ['NDNabstraction'])
         #obj.source = 'examples/link-failure-abilene.cc'
 
-        #obj = bld.create_ns3_program('blackhole-sprint', ['NDNabstraction'])
-        #obj.source = 'examples/blackhole-sprint.cc'
+        obj = bld.create_ns3_program('blackhole-sprint', ['NDNabstraction'])
+        obj.source = 'examples/blackhole-sprint.cc'
 
         #obj = bld.create_ns3_program('blackhole-abilene', ['NDNabstraction'])
         #obj.source = 'examples/blackhole-abilene.cc'
