diff --git a/examples/data-producer.cpp b/examples/data-producer.cpp
index f81ab03..e401603 100644
--- a/examples/data-producer.cpp
+++ b/examples/data-producer.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018, Regents of the University of California.
+ * Copyright (c) 2014-2019, Regents of the University of California.
  *
  * This file is part of NDN repo-ng (Next generation of NDN repository).
  * See AUTHORS.md for complete list of repo-ng authors and contributors.
@@ -18,9 +18,10 @@
  */
 
 /**
- * This file demonstrates how to generate data to be stored in repo with repo watch
- * protocol and repo insert protocol.
- * The details of the protocols can be find here
+ * @file This file demonstrates how to generate data to be stored in a repo using
+ *       the repo watch protocol and repo insertion protocol.
+ *
+ * The details of the protocols can be found here:
  *  <https://redmine.named-data.net/projects/repo-ng/wiki/Watched_Prefix_Insertion_Protocol>
  *  <https://redmine.named-data.net/projects/repo-ng/wiki/Basic_Repo_Insertion_Protocol>
  *
@@ -33,10 +34,16 @@
  * The description of command parameter can be found in the function usage().
  */
 
-#include "../src/common.hpp"
-
 #include <boost/asio/io_service.hpp>
 #include <boost/lexical_cast.hpp>
+
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/util/random.hpp>
+#include <ndn-cxx/util/scheduler.hpp>
+#include <ndn-cxx/util/time.hpp>
+
 #include <fstream>
 #include <iostream>
 #include <random>
@@ -46,7 +53,7 @@
 
 using ndn::time::milliseconds;
 
-static const milliseconds DEFAULT_TIME_INTERVAL(2000);
+const milliseconds DEFAULT_TIME_INTERVAL(2000);
 
 enum Mode {
   AUTO,
@@ -59,23 +66,17 @@
   class Error : public std::runtime_error
   {
   public:
-    explicit
-    Error(const std::string& what)
-      : std::runtime_error(what)
-    {
-    }
+    using std::runtime_error::runtime_error;
   };
 
 public:
   Publisher()
     : mode(AUTO)
-    , dataPrefix(Name("/example/data"))
+    , dataPrefix("/example/data")
     , timeInterval(DEFAULT_TIME_INTERVAL)
     , duration(0)
     , m_scheduler(m_face.getIoService())
-    , m_randomEngine(std::random_device{}())
     , m_randomDist(200, 1000)
-    , m_range([this] { return m_randomDist(m_randomEngine); })
   {
   }
 
@@ -88,32 +89,30 @@
   void
   generateFromFile();
 
-  std::shared_ptr<ndn::Data>
+  static std::shared_ptr<ndn::Data>
   createData(const ndn::Name& name);
 
 public:
   std::ifstream insertStream;
   Mode mode;
-  Name dataPrefix;
+  ndn::Name dataPrefix;
   milliseconds timeInterval;
   milliseconds duration;
 
 private:
   ndn::Face m_face;
   ndn::Scheduler m_scheduler;
-  std::mt19937 m_randomEngine;
-  std::uniform_int_distribution<unsigned int> m_randomDist;
-  std::function<unsigned int(void)> m_range;
+  std::uniform_int_distribution<> m_randomDist;
 };
 
 void
 Publisher::run()
 {
   if (mode == AUTO) {
-    m_scheduler.scheduleEvent(timeInterval, std::bind(&Publisher::autoGenerate, this));
+    m_scheduler.schedule(timeInterval, [this] { autoGenerate(); });
   }
   else {
-    m_scheduler.scheduleEvent(timeInterval, std::bind(&Publisher::generateFromFile, this));
+    m_scheduler.schedule(timeInterval, [this] { generateFromFile(); });
   }
   m_face.processEvents(duration);
 }
@@ -121,11 +120,12 @@
 void
 Publisher::autoGenerate()
 {
-  Name name = dataPrefix;
-  name.appendNumber(m_range());
-  std::shared_ptr<Data> data = createData(name);
+  ndn::Name name = dataPrefix;
+  name.appendNumber(m_randomDist(ndn::random::getRandomNumberEngine()));
+  auto data = createData(name);
   m_face.put(*data);
-  m_scheduler.scheduleEvent(timeInterval, std::bind(&Publisher::autoGenerate, this));
+
+  m_scheduler.schedule(timeInterval, [this] { autoGenerate(); });
 }
 
 void
@@ -134,23 +134,25 @@
   if (insertStream.eof()) {
     m_face.getIoService().stop();
     return;
-   }
+  }
+
   std::string name;
   getline(insertStream, name);
-  std::shared_ptr<Data> data = createData(Name(name));
+  auto data = createData(ndn::Name(name));
   m_face.put(*data);
-  m_scheduler.scheduleEvent(timeInterval, std::bind(&Publisher::generateFromFile, this));
+
+  m_scheduler.schedule(timeInterval, [this] { generateFromFile(); });
 }
 
-std::shared_ptr<Data>
-Publisher::createData(const Name& name)
+std::shared_ptr<ndn::Data>
+Publisher::createData(const ndn::Name& name)
 {
   static ndn::KeyChain keyChain;
   static std::vector<uint8_t> content(1500, '-');
 
-  std::shared_ptr<ndn::Data> data = std::make_shared<Data>();
+  auto data = std::make_shared<ndn::Data>();
   data->setName(name);
-  data->setContent(&content[0], content.size());
+  data->setContent(content.data(), content.size());
   keyChain.sign(*data);
   return data;
 }
@@ -169,7 +171,7 @@
 }
 
 static int
-main(int argc, char** argv)
+main(int argc, char* argv[])
 {
   Publisher generator;
   bool isAuto = false;
@@ -179,7 +181,7 @@
     switch (opt) {
     case 'd':
       {
-        generator.dataPrefix = Name(std::string(optarg));
+        generator.dataPrefix = ndn::Name(std::string(optarg));
         generator.mode = AUTO;
         isAuto = true;
       }
@@ -236,7 +238,7 @@
 } // namespace repo
 
 int
-main(int argc, char** argv)
+main(int argc, char* argv[])
 {
   try {
     return repo::main(argc, argv);
diff --git a/src/handles/write-handle.cpp b/src/handles/write-handle.cpp
index 675f286..d971878 100644
--- a/src/handles/write-handle.cpp
+++ b/src/handles/write-handle.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018, Regents of the University of California.
+ * Copyright (c) 2014-2019, Regents of the University of California.
  *
  * This file is part of NDN repo-ng (Next generation of NDN repository).
  * See AUTHORS.md for complete list of repo-ng authors and contributors.
@@ -318,23 +318,22 @@
 void
 WriteHandle::deferredDeleteProcess(ProcessId processId)
 {
-  scheduler.scheduleEvent(PROCESS_DELETE_TIME,
-                          std::bind(&WriteHandle::deleteProcess, this, processId));
+  scheduler.schedule(PROCESS_DELETE_TIME, [=] { deleteProcess(processId); });
 }
 
 void
 WriteHandle::extendNoEndTime(ProcessInfo& process)
 {
-  ndn::time::steady_clock::TimePoint& noEndTime = process.noEndTime;
-  ndn::time::steady_clock::TimePoint now = ndn::time::steady_clock::now();
+  auto& noEndTime = process.noEndTime;
+  auto now = ndn::time::steady_clock::now();
   RepoCommandResponse& response = process.response;
   if (now > noEndTime) {
     response.setCode(405);
     return;
   }
+
   //extends noEndTime
   process.noEndTime = ndn::time::steady_clock::now() + m_noEndTimeout;
-
 }
 
 RepoCommandResponse
diff --git a/tests/integrated/test-basic-command-insert-delete.cpp b/tests/integrated/test-basic-command-insert-delete.cpp
index e57d71e..cc40734 100644
--- a/tests/integrated/test-basic-command-insert-delete.cpp
+++ b/tests/integrated/test-basic-command-insert-delete.cpp
@@ -127,7 +127,7 @@
     insertEvents.erase(eventIt);
   }
   // schedule an event 50ms later to check whether insert is Ok
-  scheduler.scheduleEvent(500_ms, std::bind(&Fixture<T>::checkInsertOk, this, interest));
+  scheduler.schedule(500_ms, std::bind(&Fixture<T>::checkInsertOk, this, interest));
 }
 
 template<class T> void
@@ -160,7 +160,7 @@
   BOOST_CHECK_EQUAL(statusCode, 200);
 
   //schedlute an event to check whether delete is Ok.
-  scheduler.scheduleEvent(100_ms, std::bind(&Fixture<T>::checkDeleteOk, this, interest));
+  scheduler.schedule(100_ms, std::bind(&Fixture<T>::checkDeleteOk, this, interest));
 }
 
 template<class T> void
@@ -230,11 +230,11 @@
     insertCommandName.append(insertParameter.wireEncode());
     Interest insertInterest = signer.makeCommandInterest(insertCommandName);
     // schedule a job to express insertInterest every 50ms
-    scheduler.scheduleEvent(milliseconds(timeCount * 50 + 1000),
-                            std::bind(&Fixture<T>::sendInsertInterest, this, insertInterest));
+    scheduler.schedule(milliseconds(timeCount * 50 + 1000),
+                       std::bind(&Fixture<T>::sendInsertInterest, this, insertInterest));
     // schedule what to do when interest timeout
-    auto delayEventId = scheduler.scheduleEvent(milliseconds(5000 + timeCount * 50),
-                                                std::bind(&Fixture<T>::delayedInterest, this));
+    auto delayEventId = scheduler.schedule(milliseconds(5000 + timeCount * 50),
+                                           std::bind(&Fixture<T>::delayedInterest, this));
     insertEvents[insertParameter.getName()] = delayEventId;
     // The delayEvent will be canceled in onInsertInterest
     insertFace.setInterestFilter(insertParameter.getName(),
@@ -258,8 +258,8 @@
     deleteCommandName.append(deleteParameter.wireEncode());
     Interest deleteInterest = signer.makeCommandInterest(deleteCommandName);
     deleteNamePairs[deleteInterest.getName()] = (*i)->getName();
-    scheduler.scheduleEvent(milliseconds(4000 + timeCount * 50),
-                            std::bind(&Fixture<T>::sendDeleteInterest, this, deleteInterest));
+    scheduler.schedule(milliseconds(4000 + timeCount * 50),
+                       std::bind(&Fixture<T>::sendDeleteInterest, this, deleteInterest));
     timeCount++;
   }
 }
@@ -271,8 +271,8 @@
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(InsertDelete, T, Datasets, Fixture<T>)
 {
   // schedule events
-  this->scheduler.scheduleEvent(0_s, std::bind(&Fixture<T>::scheduleInsertEvent, this));
-  this->scheduler.scheduleEvent(10_s, std::bind(&Fixture<T>::scheduleDeleteEvent, this));
+  this->scheduler.schedule(0_s, std::bind(&Fixture<T>::scheduleInsertEvent, this));
+  this->scheduler.schedule(10_s, std::bind(&Fixture<T>::scheduleDeleteEvent, this));
 
   this->repoFace.processEvents(30_s);
 }
diff --git a/tests/integrated/test-basic-interest-read.cpp b/tests/integrated/test-basic-interest-read.cpp
index d73b0d1..81ace5b 100644
--- a/tests/integrated/test-basic-interest-read.cpp
+++ b/tests/integrated/test-basic-interest-read.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2018, Regents of the University of California.
+ * Copyright (c) 2014-2019, Regents of the University of California.
  *
  * This file is part of NDN repo-ng (Next generation of NDN repository).
  * See AUTHORS.md for complete list of repo-ng authors and contributors.
@@ -79,9 +79,8 @@
 
       Interest readInterest((*i)->getName());
       readInterest.setMustBeFresh(true);
-      scheduler.scheduleEvent(ndn::time::milliseconds(timeCount * 50),
-                              std::bind(&BasicInterestReadFixture<Dataset>::sendInterest, this,
-                                        readInterest));
+      scheduler.schedule(ndn::time::milliseconds(timeCount * 50),
+                         std::bind(&BasicInterestReadFixture<Dataset>::sendInterest, this, readInterest));
       timeCount++;
     }
   }
@@ -133,11 +132,9 @@
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(Read, T, Datasets, BasicInterestReadFixture<T>)
 {
   this->startListen();
-  this->scheduler.scheduleEvent(1_s,
-                                std::bind(&BasicInterestReadFixture<T>::scheduleReadEvent, this));
+  this->scheduler.schedule(1_s, std::bind(&BasicInterestReadFixture<T>::scheduleReadEvent, this));
 
   this->repoFace.processEvents(20_s);
-
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/unit/tcp-bulk-insert-handle.cpp b/tests/unit/tcp-bulk-insert-handle.cpp
index ad82c10..48d1ae3 100644
--- a/tests/unit/tcp-bulk-insert-handle.cpp
+++ b/tests/unit/tcp-bulk-insert-handle.cpp
@@ -84,8 +84,7 @@
     : scheduler(ioService)
     , bulkInserter(ioService, *handle)
   {
-    guardEvent = scheduler.scheduleEvent(ndn::time::seconds(2),
-                                         std::bind(&TcpBulkInsertFixture::fail, this, "Test timed out"));
+    guardEvent = scheduler.schedule(2_s, std::bind(&TcpBulkInsertFixture::fail, this, "Test timed out"));
   }
 
   virtual void
@@ -118,12 +117,10 @@
     }
 
     if (isFinal) {
-      scheduler.cancelEvent(guardEvent);
+      guardEvent.cancel();
 
       // In case there are some outstanding handlers
-      // ioService.post(bind(&TcpBulkInsertFixture::stop, this));
-      scheduler.scheduleEvent(ndn::time::seconds(1),
-                              std::bind(&TcpBulkInsertFixture::stop, this));
+      scheduler.schedule(1_s, [this] { stop(); });
     }
   }
 
@@ -171,7 +168,6 @@
   }
 }
 
-
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
diff --git a/tools/ndnputfile.cpp b/tools/ndnputfile.cpp
index 2564a60..94fffa2 100644
--- a/tools/ndnputfile.cpp
+++ b/tools/ndnputfile.cpp
@@ -223,7 +223,7 @@
                            bind(&NdnPutFile::onRegisterFailed, this, _1, _2));
 
   if (hasTimeout)
-    m_scheduler.scheduleEvent(timeout, [this] { stopProcess(); });
+    m_scheduler.schedule(timeout, [this] { stopProcess(); });
 
   m_face.processEvents();
 }
@@ -261,7 +261,7 @@
   }
   m_processId = response.getProcessId();
 
-  m_scheduler.scheduleEvent(m_checkPeriod, [this] { startCheckCommand(); });
+  m_scheduler.schedule(m_checkPeriod, [this] { startCheckCommand(); });
 }
 
 void
@@ -409,7 +409,7 @@
     }
   }
 
-  m_scheduler.scheduleEvent(m_checkPeriod, [this] { startCheckCommand(); });
+  m_scheduler.schedule(m_checkPeriod, [this] { startCheckCommand(); });
 }
 
 void
