diff --git a/examples/synthetic-topology.cc b/examples/synthetic-topology.cc
index 9fe44be..b19b375 100644
--- a/examples/synthetic-topology.cc
+++ b/examples/synthetic-topology.cc
@@ -25,13 +25,10 @@
 #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 <iostream>
 #include <sstream>
 #include "ns3/annotated-topology-reader.h"
-#include "../utils/spring-mobility-helper.h"
 
 #include "ns3/config-store.h"
 
@@ -40,285 +37,82 @@
 
 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 
 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);
-    /*
+  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 ());
+  */
+  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 ();
+  // Install CCNx stack
+  NS_LOG_INFO ("Installing CCNx stack");
+  CcnxStackHelper ccnxHelper;
+  ccnxHelper.SetForwardingStrategy (strategy);
+  ccnxHelper.EnableLimits (true, 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"));
+  NS_LOG_INFO ("Installing Applications");
+  CcnxConsumerHelper consumerHelper ("/1");
+  ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/synthetic", "NODE1"));
     
-    consumers.Start (Seconds (0.0));
-    consumers.Stop (finishTime);
+  CcnxConsumerHelper consumerHelper2("/2");
+  ApplicationContainer consumers2 = consumerHelper2.Install(Names::Find<Node> ("/synthetic", "NODE2"));
     
-    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"));
+  CcnxProducerHelper producerHelper ("/1",1024);
+  ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/synthetic", "NODE6"));
+        
+  CcnxProducerHelper producerHelper2 ("/2",1024);
+  ApplicationContainer producers2 = producerHelper2.Install (Names::Find<Node> ("/synthetic", "NODE7"));
 
-    producers2.Start (Seconds (0.0));
-    producers2.Stop (finishTime);
+  Simulator::Schedule (Seconds (10.0), PrintTime);
 
-    // Populate FIB based on IPv4 global routing controller
-    //ccnxHelper.InstallFakeGlobalRoutes ();
-    //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE1"));
-    //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE7"));
+  // Populate FIB based on IPv4 global routing controller
+  //ccnxHelper.InstallFakeGlobalRoutes ();
+  //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE1"));
+  //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE7"));
     
-    Simulator::Schedule (Seconds (1.0), PrintFIBs);
-    PrintFIBs ();
+  Simulator::Stop (finishTime);
     
-    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 ("Run Simulation.");
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done.");
+
+  return 0;
 }
