diff --git a/examples/ccnx-grid.cc b/examples/ccnx-grid.cc
index 70cd015..da76a6c 100644
--- a/examples/ccnx-grid.cc
+++ b/examples/ccnx-grid.cc
@@ -22,133 +22,108 @@
 #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/point-to-point-grid.h"
 #include "ns3/ipv4-global-routing-helper.h"
 
 #include <iostream>
 #include <sstream>
 
-// #include "ns3/visualizer-module.h"
-#include "ns3/ccnx.h"
-
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("CcnxGrid");
 
+uint32_t nGrid = 3;
+
+void PrintTime ()
+{
+  NS_LOG_INFO (Simulator::Now ());
+
+  Simulator::Schedule (Seconds (10.0), PrintTime);
+}
+
 int 
 main (int argc, char *argv[])
 {
-    // GlobalValue::Bind ("SimulatorImplementationType", StringValue
-    //                    ("ns3::VisualSimulatorImpl"));
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("1ms"));
     
-    uint32_t n = 3;
-    
-    Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-    Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("1ms"));
-    
-    Packet::EnableChecking();
-    Packet::EnablePrinting();
-    CommandLine cmd;
-    cmd.Parse (argc, argv);
+  Packet::EnableChecking();
+  Packet::EnablePrinting();
 
-    PointToPointHelper p2p;
-    InternetStackHelper stack;
+  CommandLine cmd;
+  cmd.AddValue ("nGrid", "Number of grid nodes", nGrid);
+  cmd.Parse (argc, argv);
+
+  PointToPointHelper p2p;
+
+  InternetStackHelper stack;
+  Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+  stack.SetRoutingHelper (ipv4RoutingHelper);
     
-    Ipv4GlobalRoutingHelper ipv4RoutingHelper;
-    // Ptr<Ipv4RoutingHelper> ipv4RoutingHelper = stack.GetRoutingHelper ();
-    stack.SetRoutingHelper (ipv4RoutingHelper);
+  PointToPointGridHelper grid (nGrid, nGrid, p2p);
+  grid.BoundingBox(100,100,200,200);
+
+  // Install CCNx stack
+  NS_LOG_INFO ("Installing CCNx stack");
+  CcnxStackHelper ccnxHelper(Ccnx::NDN_FLOODING/*Ccnx::NDN_BESTROUTE*/);
+  ccnxHelper.InstallAll ();
+
+  // Install IP stack (necessary to populate FIB)
+  NS_LOG_INFO ("Installing IP stack");
+  grid.InstallStack (stack);
+  grid.AssignIpv4Addresses (
+                            Ipv4AddressHelper("10.1.0.0", "255.255.255.0"),
+                            Ipv4AddressHelper("10.2.0.0", "255.255.255.0")
+                            );
+
+  Ptr<Node> producer = grid.GetNode (nGrid-1, nGrid-1);
+  NodeContainer consumerNodes;
+  consumerNodes.Add (grid.GetNode (0,0));
+  
+  // Populate FIB based on IPv4 global routing controller
+  ccnxHelper.InstallFakeGlobalRoutes ();
+  ccnxHelper.InstallRouteTo (producer);
+
+  NS_LOG_INFO ("Installing Applications");
+  std::ostringstream prefix;
+  prefix << "/" << producer->GetId ();
+  
+  CcnxConsumerHelper consumerHelper (prefix.str ());
+  ApplicationContainer consumers = consumerHelper.Install (consumerNodes);
+  
+  consumers.Start (Seconds (0));
+  consumers.Stop (Seconds (2000));
     
-    PointToPointGridHelper grid (n, n, p2p);
-    grid.BoundingBox(100,100,200,200);
-    grid.InstallStack (stack);
-    
-    // // Create router nodes, initialize routing database and set up the routing
-    // // tables in the nodes.
-    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-    
-    grid.AssignIpv4Addresses (
-                              Ipv4AddressHelper("10.1.0.0", "255.255.255.0"),
-                              Ipv4AddressHelper("10.2.0.0", "255.255.255.0")
-                              );
-    
-    NS_LOG_INFO ("Installing NDN stack");
-    NodeContainer c;
-    
-    for(uint32_t i=0; i<n; i++)
+  CcnxProducerHelper producerHelper (prefix.str (),120);
+  ApplicationContainer producers = producerHelper.Install (producer);
+  
+  producers.Start(Seconds(0.0));
+  producers.Stop(Seconds(2000.0));
+
+  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++)
     {
-        for(uint32_t j=0; j<n; j++)
-        {
-            NS_LOG_INFO ("Adding node i="<<i << " j=" << j);
-            c.Add(grid.GetNode(i,j));
-            
-            int nodeCount = i*n+j+1;
-            std::stringstream ss;
-            ss<<nodeCount;
-            Names::Add (ss.str(), c.Get (c.GetN()-1));
-            NS_LOG_INFO("Eventual name is " << ss.str());
-        }
+      *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
+
+      Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
+      NS_ASSERT_MSG (fib != 0, "Fire alarm");
+      *routingStream->GetStream () << *fib << "\n\n";
     }
-    CcnxStackHelper ccnx(Ccnx::NDN_FLOODING/*Ccnx::NDN_BESTROUTE*/);
-    Ptr<CcnxFaceContainer> cf = ccnx.Install (c);
 
-    NS_LOG_INFO ("Installing Applications");
-    CcnxConsumerHelper helper ("/3");
-    ApplicationContainer app = helper.Install (grid.GetNode (0,0));
-    app.Start (Seconds (1.0));
-    app.Stop (Seconds (1000.05));
+  Simulator::Schedule (Seconds (10.0), PrintTime);
+  
+  // NS_LOG_INFO ("FIB dump:\n" << *c.Get(0)->GetObject<CcnxFib> ());
+  // NS_LOG_INFO ("FIB dump:\n" << *c.Get(1)->GetObject<CcnxFib> ());
     
-    CcnxProducerHelper helper2 ("/3",120);
-    ApplicationContainer app2 = helper2.Install(grid.GetNode (2,2));
-    app2.Start(Seconds(0.0));
-    app2.Stop(Seconds(1500.0));
+  Simulator::Stop (Seconds (2000));
     
-    /**
-     * \brief Add forwarding entry in FIB
-     *
-     * \param node Node
-     * \param prefix Routing prefix
-     * \param face Face index
-     * \param metric Routing metric
-     */
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done!");
     
-    //2x2 works
-    /*ccnx.AddRoute ("1", "/3", 0, 1);
-    ccnx.AddRoute ("1", "/3", 1, 1);
-    
-    ccnx.AddRoute ("2", "/3", 1, 1);
-    ccnx.AddRoute ("3", "/3", 1, 1);
-    */
-    
-    //3x3
-    
-    ccnx.AddRoute ("1", "/3", 0, 1);
-    ccnx.AddRoute ("1", "/3", 1, 1);
-    
-    ccnx.AddRoute ("2", "/3", 1, 1);
-    
-    ccnx.AddRoute ("3", "/3", 1, 1);
-    
-    ccnx.AddRoute ("4", "/3", 2, 1);
-    
-    ccnx.AddRoute ("6", "/3", 2, 1);
-    
-    ccnx.AddRoute ("7", "/3", 1, 1);
-    
-    ccnx.AddRoute ("8", "/3", 1, 1);
-    
-    
-    NS_LOG_INFO ("FIB dump:\n" << *c.Get(0)->GetObject<CcnxFib> ());
-    NS_LOG_INFO ("FIB dump:\n" << *c.Get(1)->GetObject<CcnxFib> ());
-    
-    
-    
-    Simulator::Stop (Seconds (2000));
-    
-    NS_LOG_INFO ("Run Simulation.");
-    Simulator::Run ();
-    Simulator::Destroy ();
-    NS_LOG_INFO ("Done!");
-    
-    return 0;
-
+  return 0;
 }
