diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
index b5984e7..6fc3a40 100644
--- a/apps/ccnx-consumer.cc
+++ b/apps/ccnx-consumer.cc
@@ -355,8 +355,8 @@
 CcnxConsumer::OnTimeout (uint32_t sequenceNumber)
 {
   // std::cout << "TO: " << sequenceNumber << "\n";
-  // m_retxSeqs.insert (sequenceNumber);
   // std::cout << "Current RTO: " << m_rtt->RetransmitTimeout ().ToDouble (Time::S) << "s\n";
+  m_retxSeqs.insert (sequenceNumber);
   ScheduleNextPacket (); 
 }
 
diff --git a/examples/base-experiment.h b/examples/base-experiment.h
index 7a9e4bf..873a956 100644
--- a/examples/base-experiment.h
+++ b/examples/base-experiment.h
@@ -63,7 +63,7 @@
     reader->Commit ();
   }
 
-  void InstallCcnxStack ()
+  void InstallCcnxStack (bool installFIBs = true)
   {
     InternetStackHelper stack;
     Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
@@ -80,9 +80,12 @@
     ccnxHelper.SetDefaultRoutes (false);
     ccnxHelper.InstallAll ();
 
-    // // Populate FIB based on IPv4 global routing controller
     ccnxHelper.InstallFakeGlobalRoutes ();
-    ccnxHelper.InstallRoutesToAll ();
+    if (installFIBs)
+      {
+        // // Populate FIB based on IPv4 global routing controller
+        ccnxHelper.InstallRoutesToAll ();
+      }
   }
   
   void InstallIpStack ()
diff --git a/examples/blackhole-sprint.cc b/examples/blackhole-sprint.cc
index a6afb82..d826ce6 100644
--- a/examples/blackhole-sprint.cc
+++ b/examples/blackhole-sprint.cc
@@ -63,6 +63,7 @@
     list<string> prefixes;
 
     // Create Producers/Hijackers
+    uint32_t pair = 0;
     for (list<tuple<uint32_t,uint32_t> >::iterator i = m_pairs.begin (); i != m_pairs.end (); i++)
       {
         uint32_t node1_num = i->get<0> ();
@@ -74,7 +75,8 @@
         // node1 legitimate producer
         // node2 "fake" producer
 
-        string prefix = "/" + lexical_cast<string> (node1->GetId ());
+        string prefix = "/bh/" + lexical_cast<string> (pair);
+        pair ++;
 
         CcnxAppHelper legitimateProducerHelper ("ns3::CcnxProducer");
         legitimateProducerHelper.SetPrefix (prefix);
@@ -87,6 +89,7 @@
           (fakeProducerHelper.Install (node2));
         
         // one more trick. Need to install route to hijacker (aka "hijacker announces itself as a legitimate producer")
+        CcnxStackHelper::InstallRouteTo (prefix, node1);
         CcnxStackHelper::InstallRouteTo (prefix, node2);
 
         prefixes.push_back (prefix); // remember prefixes that consumers will be requesting
@@ -108,12 +111,14 @@
         BOOST_FOREACH (const string &prefix, prefixes)
           {
             consumerHelper.SetPrefix (prefix);
-            consumerHelper.SetAttribute ("MeanRate", StringValue ("8Kbps")); // this is about 1 interest a second
+            consumerHelper.SetAttribute ("MeanRate", StringValue ("1000Kbps")); // this is about 1 interest a second
             consumerHelper.SetAttribute ("Size", DoubleValue(requestSize));
             
             apps.Add
               (consumerHelper.Install (*node));
           }
+
+        // break;
       }
     return apps;
   }
@@ -126,6 +131,7 @@
   
   Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("100Mbps"));
   Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("2000"));
+  Config::SetDefault ("ns3::RttEstimator::InitialEstimation", StringValue ("1s"));
 
   Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("attributes.xml"));
   Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
@@ -142,7 +148,7 @@
   // config.ConfigureDefaults ();
 
   Experiment experiment;
-  for (uint32_t i = 0; i < 80; i++)
+  for (uint32_t i = startRun; i < maxRuns; i++)
     {
       Config::SetGlobal ("RngRun", IntegerValue (i));
       cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
@@ -151,18 +157,18 @@
       experiment.GenerateRandomPairs (10);
       cout << "Run " << i << endl;
       
-      string prefix = "run-" + lexical_cast<string> (i) + "-";
+      string prefix = "blackhole-" + lexical_cast<string> (i) + "-";
   
       experiment.ConfigureTopology ();
-      experiment.InstallCcnxStack ();
+      experiment.InstallCcnxStack (false);
       ApplicationContainer apps = experiment.AddApplications ();
             
       //tracing
       CcnxTraceHelper traceHelper;
       // traceHelper.EnableRateL3All (prefix + "rate-trace.log");
-      traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
+      traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumerCbr", prefix + "consumers-seqs.log");
       
-      experiment.Run (Seconds(20.0));
+      experiment.Run (Seconds(40.0));
     }
 
   cout << "Finish blackhole scenario\n";
