diff --git a/examples/consumer-with-timer.cpp b/examples/consumer-with-timer.cpp
new file mode 100644
index 0000000..b8415d0
--- /dev/null
+++ b/examples/consumer-with-timer.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2013 Regents of the University of California.
+ * @author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * See COPYING for copyright and distribution information.
+ */
+
+// correct way to include NDN-CPP headers
+// #include <ndn-cpp-dev/face.hpp>
+#include "face.hpp"
+#include "util/scheduler.hpp"
+
+#include <stdexcept>
+
+#if NDN_CPP_HAVE_CXX11
+// In the std library, the placeholders are in a different namespace than boost.
+using namespace ndn::func_lib::placeholders;
+#endif
+
+void
+onData(ndn::Face &face,
+       const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest, const ndn::ptr_lib::shared_ptr<ndn::Data> &data)
+{
+  std::cout << "I: " << interest->toUri() << std::endl;
+  std::cout << "D: " << data->getName().toUri() << std::endl;
+}
+
+void
+onTimeout(ndn::Face &face,
+          const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest)
+{
+  std::cout << "Timeout" << std::endl;
+}
+
+void
+delayedInterest(ndn::Face &face)
+{
+  std::cout << "One more Interest, delayed by the scheduler" << std::endl;
+  
+  ndn::Interest i(ndn::Name("/localhost/testApp/randomData"));
+  i.setScope(1);
+  i.setInterestLifetime(1000);
+  i.setMustBeFresh(true);
+
+  face.expressInterest(i,
+                       ndn::bind(&onData, boost::ref(face), _1, _2),
+                       ndn::bind(&onTimeout, boost::ref(face), _1));
+}
+
+void
+BlockPrinter(const ndn::Block &block, const std::string &indent="")
+{
+  std::cout << indent << block.type() << " (" << block.value_size() << ") [[";
+  std::cout.write(reinterpret_cast<const char *>(block.value()), block.value_size());
+  std::cout<< "]]" << std::endl;
+
+  for(ndn::Block::element_const_iterator i = block.getAll().begin();
+      i != block.getAll().end();
+      ++i)
+    {
+      BlockPrinter(*i, indent+"  ");
+    }
+}
+
+int main()
+{
+  try {
+    // Explicitly create io_service object, which can be shared between
+    // Face and Scheduler
+    ndn::shared_ptr<boost::asio::io_service> io =
+      ndn::make_shared<boost::asio::io_service>();
+    
+    ndn::Interest i(ndn::Name("/localhost/testApp/randomData"));
+    i.setScope(1);
+    i.setInterestLifetime(1000);
+    i.setMustBeFresh(true);
+
+    ndn::Face face(io);
+    face.expressInterest(i,
+                          ndn::bind(&onData, boost::ref(face), _1, _2),
+                          ndn::bind(&onTimeout, boost::ref(face), _1));
+
+
+    ndn::Scheduler scheduler(*io);
+    scheduler.scheduleEvent(ndn::time::seconds(2),
+                            ndn::bind(&delayedInterest, boost::ref(face)));
+    
+    io->run();
+    
+    // Alternatively, a helper face.processEvents() also can be called
+    // processEvents will block until the requested data received or timeout occurs
+    // face.processEvents();
+  }
+  catch(std::exception &e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+  }
+  return 0;
+}
