diff --git a/examples/annotated-topology-read-example.cc b/examples/annotated-topology-read-example.cc
index 63e42c4..7aff4fe 100644
--- a/examples/annotated-topology-read-example.cc
+++ b/examples/annotated-topology-read-example.cc
@@ -30,18 +30,22 @@
 #include "ns3/ipv4-list-routing-helper.h"
 #include "ns3/annotated-topology-reader.h"
 #include <list>
-//#include "ns3/visualizer-module.h"
+#include "ns3/visualizer-module.h"
+#include "ns3/ccnx.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/NDNabstraction-module.h"
 
 using namespace ns3;
 using namespace std;
 
-NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReadingExample");
+NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyExample");
 
 int main (int argc, char *argv[])
 {
     GlobalValue::Bind ("SimulatorImplementationType", StringValue
                        ("ns3::VisualSimulatorImpl"));
-    
+    Packet::EnableChecking();
+    Packet::EnablePrinting();
     string input ("/Users/iliamo/ns3-abstract-ndn/ns-3.11/src/NDNabstraction/examples/simpletopology.txt");
     
     // Set up command line parameters used to control the experiment.
@@ -71,6 +75,16 @@
         return -1;
     }
     
+    
+    for(uint32_t j=0; j<nodes.GetN(); j++)
+    {
+        uint32_t name = j+1;
+        std::stringstream ss;
+        ss<<name;
+        Names::Add (ss.str(), nodes.Get (j));
+        NS_LOG_INFO("Name = " << ss.str());
+    }
+ 
     // ------------------------------------------------------------
     // -- Create nodes and network stacks
     // --------------------------------------------
@@ -79,15 +93,30 @@
     
     
     //routing
-    Ipv4StaticRoutingHelper staticRouting;
-    Ipv4ListRoutingHelper listRH;
-    listRH.Add (staticRouting, 0);
-    stack.SetRoutingHelper (listRH);  // has effect on the next Install ()
-    stack.Install (nodes);
+    //Ipv4StaticRoutingHelper staticRouting;
+    //Ipv4ListRoutingHelper listRH;
+    //listRH.Add (staticRouting, 0);
+    //stack.SetRoutingHelper (listRH);  // has effect on the next Install ()
+    //stack.Install (nodes);
+    
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper;
+    // Ptr<Ipv4RoutingHelper> ipv4RoutingHelper = stack.GetRoutingHelper ();
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    stack.Install(nodes);
     
     NS_LOG_INFO ("creating ip4 addresses");
     Ipv4AddressHelper address;
     address.SetBase ("10.0.0.0", "255.255.255.252");
+   
+    // // 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")
+                              );
+*/
     
     int totlinks = reader->LinksSize ();
     
@@ -106,8 +135,39 @@
     reader->ApplySettings(ndc,nc);
     ///*** settings applied
     
-    
+    NS_LOG_INFO("installing ccnx stack");
+    CcnxStackHelper ccnx(Ccnx::NDN_FLOODING);
+    Ptr<CcnxFaceContainer> cf = ccnx.Install (nodes);
      
+    NS_LOG_INFO ("Installing Applications");
+    CcnxConsumerHelper helper ("/3");
+    ApplicationContainer app = helper.Install (nodes.Get(1));
+    app.Start (Seconds (1.0));
+    app.Stop (Seconds (1000.05));
+    
+    /*CcnxConsumerHelper helper2 ("/4");
+     ApplicationContainer app2 = helper2.Install(c.Get(5));
+     app2.Start (Seconds (1.0));
+     app2.Stop (Seconds (1000.05));
+     */
+    CcnxProducerHelper helper3 ("/3",120);
+    ApplicationContainer app3 = helper3.Install(nodes.Get(6));
+    app3.Start(Seconds(0.0));
+    app3.Stop(Seconds(1500.0));
+    /*
+     CcnxProducerHelper helper4 ("/4",150);
+     ApplicationContainer app4 = helper4.Install(c.Get(0));
+     app4.Start(Seconds(0.0));
+     app4.Stop(Seconds(1500.0));
+     */
+
+    NS_LOG_INFO("Routes");
+    ccnx.AddRoute("1","/3",0,1);
+    ccnx.AddRoute("3","/3",1,1);
+    ccnx.AddRoute("3","/3",2,2);
+    /*ccnx.AddRoute("4","/3",1,1);
+    ccnx.AddRoute("5","/3",2,1);
+*/
     
     // it creates little subnets, one for each couple of nodes.
     NS_LOG_INFO ("creating ipv4 interfaces");
diff --git a/examples/syntactic-topology-ndnabstraction.cc b/examples/syntactic-topology-ndnabstraction.cc
index a1a92a1..61f5c49 100644
--- a/examples/syntactic-topology-ndnabstraction.cc
+++ b/examples/syntactic-topology-ndnabstraction.cc
@@ -1,17 +1,36 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; c-set-offset 'innamespace 0; -*- */
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- *  sync-topology-ndnabstraction.cpp
- *  XcodeProject
+ * Copyright (c) 2011 University of California, Los Angeles
  *
- *  Created by Ilya on 7/18/11.
- *  Copyright 2011 __MyCompanyName__. All rights reserved.
+ * 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/internet-module.h"
 #include "ns3/point-to-point-module.h"
-#include "ns3/applications-module.h"
+#include "ns3/NDNabstraction-module.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;
 
@@ -20,11 +39,17 @@
 int 
 main (int argc, char *argv[])
 {
+  GlobalValue::Bind ("SimulatorImplementationType", StringValue
+                       ("ns3::VisualSimulatorImpl"));
+    
   // Set up some default values for the simulation.  Use the 
   
   Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (210));
   Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("448kb/s"));
   
+    Packet::EnableChecking();
+    Packet::EnablePrinting();
+
   // Allow the user to override any of the defaults and the above
   // DefaultValue::Bind ()s at run-time, via command-line arguments
   CommandLine cmd;
@@ -34,25 +59,32 @@
   NS_LOG_INFO ("Create nodes.");
   NodeContainer c;
   c.Create (7);
-  
-  
+    Names::Add ("1", c.Get (0));
+    Names::Add ("2", c.Get (1));
+    Names::Add ("3", c.Get (2));
+    Names::Add ("4", c.Get (3));
+    Names::Add ("5", c.Get (4));
+    Names::Add ("6", c.Get (5));
+    Names::Add ("7", c.Get (6));
+    
+    
   NodeContainer n13 = NodeContainer (c.Get (0), c.Get (2));
-  NodeContainer n23 = NodeContainer (c.Get (1), c.Get (3));
+  NodeContainer n23 = NodeContainer (c.Get (1), c.Get (2));
   NodeContainer n35 = NodeContainer (c.Get (2), c.Get (4));
   NodeContainer n34 = NodeContainer (c.Get (2), c.Get (3));
   NodeContainer n45 = NodeContainer (c.Get (3), c.Get (4));
   NodeContainer n56 = NodeContainer (c.Get (4), c.Get (5));
   NodeContainer n57 = NodeContainer (c.Get (4), c.Get (6));
   
-  Ipv4StaticRoutingHelper staticRouting;
+  //Ipv4StaticRoutingHelper staticRouting;
   
-  Ipv4ListRoutingHelper list;
-  list.Add (staticRouting, 1);
+  //Ipv4ListRoutingHelper list;
+  //list.Add (staticRouting, 1);
   
   //Add static routing
-  InternetStackHelper internet;
-  internet.SetRoutingHelper (list); // has effect on the next Install ()
-  internet.Install (c);
+  //InternetStackHelper internet;
+  //internet.SetRoutingHelper (list); // has effect on the next Install ()
+  //internet.Install (c);
   
   // We create the channels first without any IP addressing information
   NS_LOG_INFO ("Create channels.");
@@ -76,6 +108,15 @@
   p2p.SetChannelAttribute ("Delay", StringValue ("50ms"));
   NetDeviceContainer nd35 = p2p.Install (n35);
   
+    InternetStackHelper stack;
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper;
+    // Ptr<Ipv4RoutingHelper> ipv4RoutingHelper = stack.GetRoutingHelper ();
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    stack.Install(c);
+    // // Create router nodes, initialize routing database and set up the routing
+    // // tables in the nodes.
+    Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+    
   // Later, we add IP addresses.
   NS_LOG_INFO ("Assign IP Addresses.");
   Ipv4AddressHelper ipv4;
@@ -88,10 +129,59 @@
   Ipv4InterfaceContainer i56 = ipv4.Assign (nd56);
   Ipv4InterfaceContainer i57 = ipv4.Assign (nd57);
   
-  
+    
+    
+    
+    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 (c.Get(1));
+    app.Start (Seconds (1.0));
+    app.Stop (Seconds (1000.05));
+    
+    /*CcnxConsumerHelper helper2 ("/4");
+    ApplicationContainer app2 = helper2.Install(c.Get(5));
+    app2.Start (Seconds (1.0));
+    app2.Stop (Seconds (1000.05));
+    */
+    CcnxProducerHelper helper3 ("/3",120);
+    ApplicationContainer app3 = helper3.Install(c.Get(6));
+    app3.Start(Seconds(0.0));
+    app3.Stop(Seconds(1500.0));
+    /*
+    CcnxProducerHelper helper4 ("/4",150);
+    ApplicationContainer app4 = helper4.Install(c.Get(0));
+    app4.Start(Seconds(0.0));
+    app4.Stop(Seconds(1500.0));
+  */
+    
+    ccnx.AddRoute("1","/3",0,1);
+    ccnx.AddRoute("3","/3",2,1);
+    ccnx.AddRoute("3","/3",3,1);
+    ccnx.AddRoute("4","/3",1,1);
+    ccnx.AddRoute("5","/3",2,1);
+    
+    /*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);
+  */
+    
   // Create the OnOff application to send UDP datagrams of size
   // 210 bytes at a rate of 448 Kb/s from n0 to n4
-  NS_LOG_INFO ("Create Applications.");
+  /*NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
   
   std::string sendsizeattr = "SendSize";
@@ -125,9 +215,9 @@
   
   AsciiTraceHelper ascii;
   p2p.EnableAsciiAll (ascii.CreateFileStream ("sync-topology-ndnabstraction.tr"));
-  p2p.EnablePcapAll ("sync-topology-ndnabstraction");
+  p2p.EnablePcapAll ("sync-topology-ndnabstraction");*/
   
-  Simulator::Stop (Seconds (20));
+  Simulator::Stop (Seconds (2000));
   
   NS_LOG_INFO ("Run Simulation.");
   Simulator::Run ();
