diff --git a/apps/ccnx-hijacker.cc b/apps/ccnx-hijacker.cc
new file mode 100644
index 0000000..c0d74d7
--- /dev/null
+++ b/apps/ccnx-hijacker.cc
@@ -0,0 +1,117 @@
+/* -*-  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>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-hijacker.h"
+#include "ns3/log.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+#include "ns3/string.h"
+#include "ns3/uinteger.h"
+#include "ns3/packet.h"
+
+#include "../model/ccnx-local-face.h"
+#include "ns3/ccnx-fib.h"
+
+#include <boost/ref.hpp>
+
+NS_LOG_COMPONENT_DEFINE ("CcnxHijacker");
+
+namespace ns3
+{    
+
+NS_OBJECT_ENSURE_REGISTERED (CcnxHijacker);
+    
+TypeId
+CcnxHijacker::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::CcnxHijacker")
+    .SetParent<CcnxApp> ()
+    .AddConstructor<CcnxHijacker> ()
+    .AddAttribute ("Prefix","Prefix, which hijacker wants to attack",
+                   StringValue ("/"),
+                   MakeCcnxNameComponentsAccessor (&CcnxHijacker::m_prefix),
+                   MakeCcnxNameComponentsChecker ())
+    .AddAttribute ("PayloadSize", "Virtual payload size for Content packets",
+                   UintegerValue (1024),
+                   MakeUintegerAccessor(&CcnxHijacker::m_virtualPayloadSize),
+                   MakeUintegerChecker<uint32_t>())
+    
+    .AddTraceSource ("TransmittedContentObjects", "TransmittedContentObjects",
+                    MakeTraceSourceAccessor (&CcnxHijacker::m_transmittedContentObjects))
+    ;
+        
+  return tid;
+}
+    
+CcnxHijacker::CcnxHijacker ()
+{
+  // NS_LOG_FUNCTION_NOARGS ();
+}
+
+// inherited from Application base class.
+void
+CcnxHijacker::StartApplication ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  NS_ASSERT (GetNode ()->GetObject<CcnxFib> () != 0);
+
+  CcnxApp::StartApplication ();
+
+  GetNode ()->GetObject<CcnxFib> ()->Add (m_prefix, m_face, 0);
+}
+
+void
+CcnxHijacker::StopApplication ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  NS_ASSERT (GetNode ()->GetObject<CcnxFib> () != 0);
+
+  CcnxApp::StopApplication ();
+}
+
+
+void
+CcnxHijacker::OnInterest (const Ptr<const CcnxInterestHeader> &interest)
+{
+  CcnxApp::OnInterest (interest); // tracing inside
+
+  NS_LOG_FUNCTION (this << interest);
+
+  /*
+  if (!m_active) return;
+    
+  static CcnxContentObjectTail tail;
+  Ptr<CcnxContentObjectHeader> header = Create<CcnxContentObjectHeader> ();
+  header->SetName (Create<CcnxNameComponents> (interest->GetName ()));
+
+  NS_LOG_INFO ("Respodning with ContentObject:\n" << boost::cref(*header));
+  
+  Ptr<Packet> packet = Create<Packet> (m_virtualPayloadSize);
+
+  m_transmittedContentObjects (header, packet, this, m_face);
+  
+  packet->AddHeader (*header);
+  packet->AddTrailer (tail);
+
+  m_protocolHandler (packet);*/
+}
+
+} // namespace ns3
diff --git a/apps/ccnx-hijacker.h b/apps/ccnx-hijacker.h
new file mode 100644
index 0000000..20adf46
--- /dev/null
+++ b/apps/ccnx-hijacker.h
@@ -0,0 +1,62 @@
+/* -*-  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>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef CCNX_HIJACKER_H
+#define CCNX_HIJACKER_H
+
+#include "ccnx-app.h"
+
+#include "ns3/ptr.h"
+#include "ns3/ccnx-name-components.h"
+
+namespace ns3 
+{
+
+class CcnxHijacker : public CcnxApp
+{
+public: 
+  static TypeId
+  GetTypeId (void);
+        
+  CcnxHijacker ();
+
+  // inherited from CcnxApp
+  void OnInterest (const Ptr<const CcnxInterestHeader> &interest);
+
+protected:
+  // inherited from Application base class.
+  virtual void
+  StartApplication ();    // Called at time specified by Start
+
+  virtual void
+  StopApplication ();     // Called at time specified by Stop
+
+private:
+  CcnxNameComponents m_prefix;
+  uint32_t m_virtualPayloadSize;
+
+  TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                 Ptr<CcnxApp>, Ptr<CcnxFace> > m_transmittedContentObjects;
+};
+
+}
+
+#endif // CCNX_HIJACKER_H
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
deleted file mode 100644
index f118b04..0000000
--- a/examples/link-failure-abilene.cc
+++ /dev/null
@@ -1,171 +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 "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 <iostream>
-#include <sstream>
-#include "ns3/annotated-topology-reader.h"
-#include "../utils/spring-mobility-helper.h"
-
-#include "ns3/config-store.h"
-
-using namespace ns3;
-using namespace std;
-
-NS_LOG_COMPONENT_DEFINE ("CcnxLinkFailureAbilene");
-
-
-int 
-main (int argc, char *argv[])
-{
-  // Packet::EnableChecking();
-  // Packet::EnablePrinting();
-  string input ("./src/NDNabstraction/examples/abilene-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);
-    
-  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)
-    {
-      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> ("/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);
-  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/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index 194a90c..db8392d 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -112,6 +112,11 @@
   return m_nodes;
 }
 
+std::list<TopologyReader::Link>
+AnnotatedTopologyReader::GetLinks () const
+{
+  return m_linksList;
+}
 
 NodeContainer
 AnnotatedTopologyReader::Read (void)
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index b9268b8..eccbc29 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -63,6 +63,12 @@
   GetNodes () const;
     
   /**
+   * \brief Get links read by the reader
+   */  
+  std::list<Link>
+  GetLinks () const;
+  
+  /**
    * \brief Assign IPv4 addresses to all links
    *
    * Note, IPv4 stack should be installed on all nodes prior this call
diff --git a/model/ccnx-pit.cc b/model/ccnx-pit.cc
index d9667cf..ca2c3f3 100644
--- a/model/ccnx-pit.cc
+++ b/model/ccnx-pit.cc
@@ -170,7 +170,7 @@
     {
       CcnxFibEntryContainer::type::iterator fibEntry = m_fib->LongestPrefixMatch (header);
       NS_ASSERT_MSG (fibEntry != m_fib->m_fib.end (),
-                     "There should be at least default route set");
+                     "There should be at least default route set" << " Prefix = "<<header.GetName() << "NodeID == " << m_fib->GetObject<Node>()->GetId() << "\n" << *m_fib);
 
       entry = insert (end (),
                       CcnxPitEntry (Create<CcnxNameComponents> (header.GetName ()),
diff --git a/wscript b/wscript
index bbdda36..e33af19 100644
--- a/wscript
+++ b/wscript
@@ -109,7 +109,7 @@
         #obj = bld.create_ns3_program('link-failure-sprint', ['NDNabstraction'])
         #obj.source = 'examples/link-failure-sprint.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'
 
     bld.ns3_python_bindings()
