diff --git a/examples/ndn-grid-multiple-strategies.cpp b/examples/ndn-grid-multiple-strategies.cpp
new file mode 100644
index 0000000..63d6613
--- /dev/null
+++ b/examples/ndn-grid-multiple-strategies.cpp
@@ -0,0 +1,109 @@
+// ndn-multiple-strategies.cc
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/point-to-point-layout-module.h"
+#include "ns3/ndnSIM-module.h"
+
+using namespace ns3;
+using ns3::ndn::StackHelper;
+using ns3::ndn::AppHelper;
+using ns3::ndn::GlobalRoutingHelper;
+using ns3::ndn::StrategyChoiceHelper;
+;
+
+/**
+ * This scenario simulates a grid topology (using PointToPointGrid module)
+ *
+ * The first six nodes use the best route forwarding strategy, whereas
+ * the three remaining nodes use the broadcast forwarding strategy.
+ *
+ * (consumer) -- ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) ----- ( )
+ *     |          |         |
+ *    ( ) ------ ( ) -- (producer)
+ *
+ * All links are 1Mbps with propagation 10ms delay.
+ *
+ * FIB is populated using NdnGlobalRoutingHelper.
+ *
+ * Consumer requests data from producer with frequency 100 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.
+ *
+ * To run scenario and see what is happening, use the following command:
+ *
+ *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-multiple-strategies
+ */
+
+int
+main(int argc, char* argv[])
+{
+  // Setting default parameters for PointToPoint links and channels
+  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("1Mbps"));
+  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("10"));
+
+  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
+  CommandLine cmd;
+  cmd.Parse(argc, argv);
+
+  // Creating 3x3 topology
+  PointToPointHelper p2p;
+  PointToPointGridHelper grid(3, 3, p2p);
+  grid.BoundingBox(100, 100, 200, 200);
+
+  // Install NDN stack on all nodes
+  StackHelper ndnHelper;
+  ndnHelper.InstallAll();
+
+  // Installing global routing interface on all nodes
+  GlobalRoutingHelper ndnGlobalRoutingHelper;
+  ndnGlobalRoutingHelper.InstallAll();
+
+  // Getting containers for the consumer/producer
+  Ptr<Node> producer = grid.GetNode(2, 2);
+  NodeContainer consumerNodes;
+  consumerNodes.Add(grid.GetNode(0, 0));
+
+  // Install NDN applications
+  std::string prefix = "/prefix";
+
+  // Install different forwarding strategies
+  StrategyChoiceHelper strategyChoiceHelper;
+  for (int row = 0; row < 3; row++) {
+    for (int column = 0; column < 3; column++) {
+      if (row < 2)
+        strategyChoiceHelper.Install(grid.GetNode(row, column), "/prefix",
+                                     "/localhost/nfd/strategy/best-route");
+      else
+        strategyChoiceHelper.Install(grid.GetNode(row, column), "/prefix",
+                                     "/localhost/nfd/strategy/broadcast");
+    }
+  }
+
+  AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix(prefix);
+  consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+  consumerHelper.Install(consumerNodes);
+
+  AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix(prefix);
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(producer);
+
+  // Add /prefix origins to ndn::GlobalRouter
+  ndnGlobalRoutingHelper.AddOrigins(prefix, producer);
+
+  // Calculate and install FIBs
+  GlobalRoutingHelper::CalculateRoutes();
+
+  Simulator::Stop(Seconds(20.0));
+  Simulator::Run();
+  Simulator::Destroy();
+
+  return 0;
+}
