diff --git a/examples/ndn-grid.cc b/examples/ndn-grid.cc
new file mode 100644
index 0000000..d037fda
--- /dev/null
+++ b/examples/ndn-grid.cc
@@ -0,0 +1,137 @@
+/* -*-  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 "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+#include "ns3/point-to-point-grid.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("NdnGrid");
+
+/**
+ * This scenario simulates a grid topology (using PointToPointGrid module)
+ *
+ * (consumer) -- ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) -- (producer)
+ *
+ * Grid size could be specified using --nGrid parameter (default 3)
+ *
+ * All links are 1Mbps with propagation 10ms delay. 
+ *
+ * FIB is populated using NdnGlobalRoutingHelper.
+ *
+ * Consumer requests data from producer with frequency 10 interests per second
+ * (interests contain constantly increasing sequence number).
+ *
+ * For every received interest, producer replies with a data packet, containing
+ * 1024 bytes of virtual payload.
+ *
+ * Simulation time is 20 seconds, unless --finish parameter is specified
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=NdnSimple:NdnConsumer ./waf --run=ndn-grid
+ */
+
+
+int 
+main (int argc, char *argv[])
+{
+  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
+  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+  
+  uint32_t nGrid = 3;
+  Time finishTime = Seconds (20.0); 
+
+  CommandLine cmd;
+  cmd.AddValue ("nGrid", "Number of grid nodes", nGrid);
+  cmd.AddValue ("finish", "Finish time", finishTime);
+  cmd.Parse (argc, argv);
+
+  PointToPointHelper p2p;
+
+  PointToPointGridHelper grid (nGrid, nGrid, p2p);
+  grid.BoundingBox(100,100,200,200);
+
+  // Install Ndn stack on all nodes
+  NS_LOG_INFO ("Installing Ndn stack on all nodes");
+  NdnStackHelper ndnHelper;
+  ndnHelper.SetContentStore ("ns3::NdnContentStoreLru",
+                              "Size", "10");
+  // ndnHelper.SetContentStore ("ns3::NdnContentStoreRandom",
+  //                             "Size", "10");
+  // ndnHelper.SetForwardingStrategy ("ns3::ndnSIM::BestRoute");
+  ndnHelper.InstallAll ();
+
+  NdnGlobalRoutingHelper ndnGlobalRoutingHelper;
+  ndnGlobalRoutingHelper.InstallAll ();
+  
+  // Getting containers for the consumer/producer
+  Ptr<Node> producer = grid.GetNode (nGrid-1, nGrid-1);
+  NodeContainer consumerNodes;
+  consumerNodes.Add (grid.GetNode (0,0));
+  
+  // Install Ndn applications
+  NS_LOG_INFO ("Installing Applications");
+  std::string prefix = "/prefix";
+  
+  NdnAppHelper consumerHelper ("ns3::NdnConsumerCbr");
+  consumerHelper.SetPrefix (prefix);
+  consumerHelper.SetAttribute ("Frequency", StringValue ("100")); // 10 interests a second
+  ApplicationContainer consumers = consumerHelper.Install (consumerNodes);
+  
+  NdnAppHelper producerHelper ("ns3::NdnProducer");
+  producerHelper.SetPrefix (prefix);
+  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
+  ApplicationContainer producers = producerHelper.Install (producer);
+
+  // Add /prefix origins to NdnGlobalRouter
+  ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
+
+  // Calculate and install FIBs
+  ndnGlobalRoutingHelper.CalculateRoutes ();
+  
+  Simulator::Stop (finishTime);
+    
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node ++)
+    {
+      std::cout << "Node #" << (*node)->GetId () << std::endl;
+      (*node)->GetObject<NdnContentStore> ()->Print (std::cout);
+      std::cout << std::endl;
+    }
+  
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done!");
+    
+  return 0;
+}
