diff --git a/examples/consumer-with-timer.cpp b/examples/consumer-with-timer.cpp
index b095d4c..04c6037 100644
--- a/examples/consumer-with-timer.cpp
+++ b/examples/consumer-with-timer.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -56,7 +56,7 @@
     std::cout << "Sending " << interest << std::endl;
 
     // Schedule a new event
-    m_scheduler.scheduleEvent(3_s, [this] { delayedInterest(); });
+    m_scheduler.schedule(3_s, [this] { delayedInterest(); });
 
     // m_ioService.run() will block until all events finished or m_ioService.stop() is called
     m_ioService.run();
diff --git a/ndn-cxx/face.cpp b/ndn-cxx/face.cpp
index a134e8e..a225a9d 100644
--- a/ndn-cxx/face.cpp
+++ b/ndn-cxx/face.cpp
@@ -318,7 +318,7 @@
     }
 
     if (timeout > time::milliseconds::zero()) {
-      m_impl->m_processEventsTimeoutEvent = m_impl->m_scheduler.scheduleEvent(timeout,
+      m_impl->m_processEventsTimeoutEvent = m_impl->m_scheduler.schedule(timeout,
         [&io = m_ioService, &work = m_impl->m_ioServiceWork] {
           io.stop();
           work.reset();
diff --git a/ndn-cxx/impl/pending-interest.hpp b/ndn-cxx/impl/pending-interest.hpp
index a139fc2..a41934e 100644
--- a/ndn-cxx/impl/pending-interest.hpp
+++ b/ndn-cxx/impl/pending-interest.hpp
@@ -185,8 +185,8 @@
   void
   scheduleTimeoutEvent(Scheduler& scheduler)
   {
-    m_timeoutEvent = scheduler.scheduleEvent(m_interest->getInterestLifetime(),
-                                             [=] { this->invokeTimeoutCallback(); });
+    m_timeoutEvent = scheduler.schedule(m_interest->getInterestLifetime(),
+                                        [=] { this->invokeTimeoutCallback(); });
   }
 
   /**
diff --git a/ndn-cxx/ims/in-memory-storage-entry.cpp b/ndn-cxx/ims/in-memory-storage-entry.cpp
index 7b04271..5720bc9 100644
--- a/ndn-cxx/ims/in-memory-storage-entry.cpp
+++ b/ndn-cxx/ims/in-memory-storage-entry.cpp
@@ -45,7 +45,7 @@
 void
 InMemoryStorageEntry::scheduleMarkStale(Scheduler& sched, time::nanoseconds after)
 {
-  m_markStaleEventId = sched.scheduleEvent(after, [this] { m_isFresh = false; });
+  m_markStaleEventId = sched.schedule(after, [this] { m_isFresh = false; });
 }
 
 } // namespace ndn
diff --git a/ndn-cxx/net/dns.cpp b/ndn-cxx/net/dns.cpp
index 55f0822..9942867 100644
--- a/ndn-cxx/net/dns.cpp
+++ b/ndn-cxx/net/dns.cpp
@@ -57,7 +57,7 @@
 
     m_resolver.async_resolve(q, bind(&Resolver::onResolveResult, this, _1, _2, self));
 
-    m_resolveTimeout = m_scheduler.scheduleEvent(timeout, [=] { onResolveTimeout(self); });
+    m_resolveTimeout = m_scheduler.schedule(timeout, [=] { onResolveTimeout(self); });
   }
 
   iterator
@@ -71,7 +71,7 @@
   onResolveResult(const boost::system::error_code& error,
                   iterator it, const shared_ptr<Resolver>& self)
   {
-    m_scheduler.cancelEvent(m_resolveTimeout);
+    m_resolveTimeout.cancel();
     // ensure the Resolver isn't destructed while callbacks are still pending, see #2653
     m_resolver.get_io_service().post([self] {});
 
diff --git a/ndn-cxx/net/impl/network-monitor-impl-osx.cpp b/ndn-cxx/net/impl/network-monitor-impl-osx.cpp
index f0866b8..b10c6eb 100644
--- a/ndn-cxx/net/impl/network-monitor-impl-osx.cpp
+++ b/ndn-cxx/net/impl/network-monitor-impl-osx.cpp
@@ -184,7 +184,7 @@
 NetworkMonitorImplOsx::scheduleCfLoop()
 {
   // poll each second for new events
-  m_cfLoopEvent = m_scheduler.scheduleEvent(1_s, [this] {
+  m_cfLoopEvent = m_scheduler.schedule(1_s, [this] {
     // this should dispatch ready events and exit
     CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
     scheduleCfLoop();
diff --git a/ndn-cxx/security/v2/certificate-fetcher-from-network.cpp b/ndn-cxx/security/v2/certificate-fetcher-from-network.cpp
index 1aef91a..df816b1 100644
--- a/ndn-cxx/security/v2/certificate-fetcher-from-network.cpp
+++ b/ndn-cxx/security/v2/certificate-fetcher-from-network.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -85,8 +85,8 @@
 
   --certRequest->nRetriesLeft;
   if (certRequest->nRetriesLeft >= 0) {
-    m_scheduler.scheduleEvent(certRequest->waitAfterNack,
-                              [=] { fetch(certRequest, state, continueValidation); });
+    m_scheduler.schedule(certRequest->waitAfterNack,
+                         [=] { fetch(certRequest, state, continueValidation); });
     certRequest->waitAfterNack *= 2;
   }
   else {
diff --git a/ndn-cxx/util/notification-subscriber.cpp b/ndn-cxx/util/notification-subscriber.cpp
index 0794e39..ce9b395 100644
--- a/ndn-cxx/util/notification-subscriber.cpp
+++ b/ndn-cxx/util/notification-subscriber.cpp
@@ -151,7 +151,7 @@
   onNack(nack);
 
   time::milliseconds delay = exponentialBackoff(nack);
-  m_nackEvent = m_scheduler.scheduleEvent(delay, [this] { sendInitialInterest(); });
+  m_nackEvent = m_scheduler.schedule(delay, [this] { sendInitialInterest(); });
 }
 
 void
diff --git a/ndn-cxx/util/scheduler.cpp b/ndn-cxx/util/scheduler.cpp
index f4b3a10..f059a4b 100644
--- a/ndn-cxx/util/scheduler.cpp
+++ b/ndn-cxx/util/scheduler.cpp
@@ -98,7 +98,7 @@
 Scheduler::~Scheduler() = default;
 
 EventId
-Scheduler::scheduleEvent(time::nanoseconds after, EventCallback callback)
+Scheduler::schedule(time::nanoseconds after, EventCallback callback)
 {
   BOOST_ASSERT(callback != nullptr);
 
diff --git a/ndn-cxx/util/scheduler.hpp b/ndn-cxx/util/scheduler.hpp
index f1a38f7..8e2e7fb 100644
--- a/ndn-cxx/util/scheduler.hpp
+++ b/ndn-cxx/util/scheduler.hpp
@@ -48,7 +48,7 @@
 /** \brief A handle of scheduled event.
  *
  *  \code
- *  EventId eid = scheduler.scheduleEvent(10_ms, [] { doSomething(); });
+ *  EventId eid = scheduler.schedule(10_ms, [] { doSomething(); });
  *  eid.cancel(); // cancel the event
  *  \endcode
  *
@@ -116,7 +116,7 @@
  *
  *  \code
  *  {
- *    ScopedEventId eid = scheduler.scheduleEvent(10_ms, [] { doSomething(); });
+ *    ScopedEventId eid = scheduler.schedule(10_ms, [] { doSomething(); });
  *  } // eid goes out of scope, canceling the event
  *  \endcode
  *
@@ -154,12 +154,20 @@
    *  \return EventId that can be used to cancel the scheduled event
    */
   EventId
-  scheduleEvent(time::nanoseconds after, EventCallback callback);
+  schedule(time::nanoseconds after, EventCallback callback);
 
-  /** \brief Cancel a scheduled event
-   *
-   *  You may also invoke `eid.cancel()`
+  /** \deprecated use schedule(after, callback)
    */
+  [[deprecated("use schedule(after, callback)")]]
+  EventId
+  scheduleEvent(time::nanoseconds after, EventCallback callback)
+  {
+    return schedule(after, std::move(callback));
+  }
+
+  /** \deprecated use EventId::cancel()
+   */
+  [[deprecated("use EventId::cancel()")]]
   void
   cancelEvent(const EventId& eid)
   {
diff --git a/ndn-cxx/util/segment-fetcher.cpp b/ndn-cxx/util/segment-fetcher.cpp
index 09cfd4e..680ff59 100644
--- a/ndn-cxx/util/segment-fetcher.cpp
+++ b/ndn-cxx/util/segment-fetcher.cpp
@@ -126,34 +126,12 @@
     interest.refreshNonce();
   }
 
-  weak_ptr<SegmentFetcher> weakSelf = m_this;
-
-  m_nSegmentsInFlight++;
-  auto pendingInterest = m_face.expressInterest(interest,
-                                                bind(&SegmentFetcher::afterSegmentReceivedCb,
-                                                     this, _1, _2, weakSelf),
-                                                bind(&SegmentFetcher::afterNackReceivedCb,
-                                                     this, _1, _2, weakSelf),
-                                                nullptr);
-  auto timeoutEvent =
-    m_scheduler.scheduleEvent(m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto(),
-                              bind(&SegmentFetcher::afterTimeoutCb, this, interest, weakSelf));
-
-  if (isRetransmission) {
-    updateRetransmittedSegment(0, pendingInterest, timeoutEvent);
-  }
-  else {
-    BOOST_ASSERT(m_pendingSegments.count(0) == 0);
-    m_pendingSegments.emplace(0, PendingSegment{SegmentState::FirstInterest, time::steady_clock::now(),
-                                                pendingInterest, timeoutEvent});
-  }
+  sendInterest(0, interest, isRetransmission);
 }
 
 void
 SegmentFetcher::fetchSegmentsInWindow(const Interest& origInterest)
 {
-  weak_ptr<SegmentFetcher> weakSelf = m_this;
-
   if (checkAllSegmentsReceived()) {
     // All segments have been retrieved
     return finalizeFetch();
@@ -194,32 +172,43 @@
     interest.setMustBeFresh(false);
     interest.setInterestLifetime(m_options.interestLifetime);
     interest.refreshNonce();
-
-    m_nSegmentsInFlight++;
-    auto pendingInterest = m_face.expressInterest(interest,
-                                                  bind(&SegmentFetcher::afterSegmentReceivedCb,
-                                                       this, _1, _2, weakSelf),
-                                                  bind(&SegmentFetcher::afterNackReceivedCb,
-                                                       this, _1, _2, weakSelf),
-                                                  nullptr);
-    auto timeoutEvent =
-      m_scheduler.scheduleEvent(m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto(),
-                                bind(&SegmentFetcher::afterTimeoutCb, this, interest, weakSelf));
-
-    if (segment.second) { // Retransmission
-      updateRetransmittedSegment(segment.first, pendingInterest, timeoutEvent);
-    }
-    else { // First request for segment
-      BOOST_ASSERT(m_pendingSegments.count(segment.first) == 0);
-      m_pendingSegments.emplace(segment.first, PendingSegment{SegmentState::FirstInterest,
-                                                              time::steady_clock::now(),
-                                                              pendingInterest, timeoutEvent});
-      m_highInterest = segment.first;
-    }
+    sendInterest(segment.first, interest, segment.second);
   }
 }
 
 void
+SegmentFetcher::sendInterest(uint64_t segNum, const Interest& interest, bool isRetransmission)
+{
+  weak_ptr<SegmentFetcher> weakSelf = m_this;
+
+  ++m_nSegmentsInFlight;
+  auto pendingInterest = m_face.expressInterest(interest,
+    [this, weakSelf] (const Interest& interest, const Data& data) {
+      afterSegmentReceivedCb(interest, data, weakSelf);
+    },
+    [this, weakSelf] (const Interest& interest, const lp::Nack& nack) {
+      afterNackReceivedCb(interest, nack, weakSelf);
+    },
+    nullptr);
+
+  auto timeout = m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto();
+  auto timeoutEvent = m_scheduler.schedule(timeout, [this, interest, weakSelf] {
+    afterTimeoutCb(interest, weakSelf);
+  });
+
+  if (isRetransmission) {
+    updateRetransmittedSegment(segNum, pendingInterest, timeoutEvent);
+    return;
+  }
+
+  PendingSegment pendingSegment{SegmentState::FirstInterest, time::steady_clock::now(),
+                                pendingInterest, timeoutEvent};
+  bool isNew = m_pendingSegments.emplace(segNum, std::move(pendingSegment)).second;
+  BOOST_VERIFY(isNew);
+  m_highInterest = segNum;
+}
+
+void
 SegmentFetcher::afterSegmentReceivedCb(const Interest& origInterest, const Data& data,
                                        const weak_ptr<SegmentFetcher>& weakSelf)
 {
diff --git a/ndn-cxx/util/segment-fetcher.hpp b/ndn-cxx/util/segment-fetcher.hpp
index 9b7f5bb..4e556d4 100644
--- a/ndn-cxx/util/segment-fetcher.hpp
+++ b/ndn-cxx/util/segment-fetcher.hpp
@@ -189,6 +189,9 @@
   fetchSegmentsInWindow(const Interest& origInterest);
 
   void
+  sendInterest(uint64_t segNum, const Interest& interest, bool isRetransmission);
+
+  void
   afterSegmentReceivedCb(const Interest& origInterest, const Data& data,
                          const weak_ptr<SegmentFetcher>& weakSelf);
 
diff --git a/tests/integrated/face.cpp b/tests/integrated/face.cpp
index 5798b0f..ddc0cd3 100644
--- a/tests/integrated/face.cpp
+++ b/tests/integrated/face.cpp
@@ -87,7 +87,7 @@
     }
 
     outcome = '?';
-    return sched.scheduleEvent(delay, [this, interest, &outcome] {
+    return sched.schedule(delay, [this, interest, &outcome] {
       face2->expressInterest(interest,
         [&] (const Interest&, const Data&) { outcome = 'D'; },
         [&] (const Interest&, const lp::Nack&) { outcome = 'N'; },
@@ -108,7 +108,7 @@
   scheduler::EventId
   terminateAfter(time::nanoseconds delay)
   {
-    return sched.scheduleEvent(delay, [this] { face.getIoService().stop(); });
+    return sched.schedule(delay, [this] { face.getIoService().stop(); });
   }
 
 protected:
@@ -184,19 +184,19 @@
     [&] (const Name&) { ++nRegSuccess; },
     [] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
 
-  this->sched.scheduleEvent(1_s, [&nRegSuccess] {
+  this->sched.schedule(1_s, [&nRegSuccess] {
     BOOST_CHECK_EQUAL(nRegSuccess, 1);
     std::string output = executeCommand("nfdc route list | grep /Hello/World");
     BOOST_CHECK(!output.empty());
   });
 
-  this->sched.scheduleEvent(2_s, [this, id, &nUnregSuccess] {
+  this->sched.schedule(2_s, [this, id, &nUnregSuccess] {
     this->face.unregisterPrefix(id,
       [&] { ++nUnregSuccess; },
       [] (const std::string& msg) { BOOST_ERROR("unexpected unregister prefix failure: " << msg); });
   });
 
-  this->sched.scheduleEvent(3_s, [&nUnregSuccess] {
+  this->sched.schedule(3_s, [&nUnregSuccess] {
     BOOST_CHECK_EQUAL(nUnregSuccess, 1);
 
     // Boost.Test would fail if a child process exits with non-zero. http://stackoverflow.com/q/5325202
@@ -221,7 +221,7 @@
     [&] (const Name&) { ++nRegSuccess2; },
     [] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
 
-  this->sched.scheduleEvent(500_ms, [] {
+  this->sched.schedule(500_ms, [] {
     std::string output = executeCommand("nfdc route list | grep /Hello/World");
     BOOST_CHECK(!output.empty());
   });
@@ -247,7 +247,7 @@
     [&] (const Name&) { ++nRegSuccess; },
     [] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
 
-  this->sched.scheduleEvent(700_ms, [] {
+  this->sched.schedule(700_ms, [] {
     std::string output = executeCommand("nfdc route list | grep /Hello/World");
     BOOST_CHECK(!output.empty());
   });
@@ -272,7 +272,7 @@
   this->face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
     [&] (const InterestFilter&, const Interest& interest) { BOOST_ERROR("unexpected Interest"); });
 
-  this->sched.scheduleEvent(700_ms, [] {
+  this->sched.schedule(700_ms, [] {
     // Boost.Test would fail if a child process exits with non-zero. http://stackoverflow.com/q/5325202
     std::string output = executeCommand("nfdc route list | grep /Hello/World || true");
     BOOST_CHECK(output.empty());
diff --git a/tests/integrated/scheduler-benchmark.cpp b/tests/integrated/scheduler-benchmark.cpp
index 9bc4600..ecf6342 100644
--- a/tests/integrated/scheduler-benchmark.cpp
+++ b/tests/integrated/scheduler-benchmark.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -45,13 +45,13 @@
 
   auto d1 = timedExecute([&] {
     for (size_t i = 0; i < nEvents; ++i) {
-      eventIds[i] = sched.scheduleEvent(1_s, []{});
+      eventIds[i] = sched.schedule(1_s, []{});
     }
   });
 
   auto d2 = timedExecute([&] {
     for (size_t i = 0; i < nEvents; ++i) {
-      sched.cancelEvent(eventIds[i]);
+      eventIds[i].cancel();
     }
   });
 
@@ -72,13 +72,13 @@
   time::steady_clock::TimePoint t2;
   // +1ms ensures this extra event is executed last. In case the overhead is less than 1ms,
   // it will be reported as 1ms.
-  sched.scheduleEvent(t1 - time::steady_clock::now() + 1_ms, [&] {
+  sched.schedule(t1 - time::steady_clock::now() + 1_ms, [&] {
     t2 = time::steady_clock::now();
     BOOST_REQUIRE_EQUAL(nExpired, nEvents);
   });
 
   for (size_t i = 0; i < nEvents; ++i) {
-    sched.scheduleEvent(t1 - time::steady_clock::now(), [&] { ++nExpired; });
+    sched.schedule(t1 - time::steady_clock::now(), [&] { ++nExpired; });
   }
 
   io.run();
diff --git a/tests/unit/security/signature-sha256-with-ecdsa.t.cpp b/tests/unit/security/signature-sha256-with-ecdsa.t.cpp
index abf15a2..3881756 100644
--- a/tests/unit/security/signature-sha256-with-ecdsa.t.cpp
+++ b/tests/unit/security/signature-sha256-with-ecdsa.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -128,15 +128,9 @@
   auto interest = makeInterest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
   auto interest11 = makeInterest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
 
-  scheduler.scheduleEvent(100_ms, [&] {
-      m_keyChain.sign(*interest, security::SigningInfo(identity));
-    });
-
+  scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest, security::SigningInfo(identity)); });
   advanceClocks(100_ms);
-  scheduler.scheduleEvent(100_ms, [&] {
-      m_keyChain.sign(*interest11, security::SigningInfo(identity));
-    });
-
+  scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest11, security::SigningInfo(identity)); });
   advanceClocks(100_ms);
 
   Block interestBlock(interest->wireEncode().wire(), interest->wireEncode().size());
diff --git a/tests/unit/security/signature-sha256-with-rsa.t.cpp b/tests/unit/security/signature-sha256-with-rsa.t.cpp
index 3fca552..2363551 100644
--- a/tests/unit/security/signature-sha256-with-rsa.t.cpp
+++ b/tests/unit/security/signature-sha256-with-rsa.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -133,15 +133,9 @@
   auto interest = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
   auto interest11 = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
 
-  scheduler.scheduleEvent(100_ms, [&] {
-      m_keyChain.sign(*interest, security::SigningInfo(identity));
-    });
-
+  scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest, security::SigningInfo(identity)); });
   advanceClocks(100_ms);
-  scheduler.scheduleEvent(100_ms, [&] {
-      m_keyChain.sign(*interest11, security::SigningInfo(identity));
-    });
-
+  scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest11, security::SigningInfo(identity)); });
   advanceClocks(100_ms);
 
   Block interestBlock(interest->wireEncode().wire(), interest->wireEncode().size());
diff --git a/tests/unit/util/scheduler.t.cpp b/tests/unit/util/scheduler.t.cpp
index 77b60a5..6497136 100644
--- a/tests/unit/util/scheduler.t.cpp
+++ b/tests/unit/util/scheduler.t.cpp
@@ -53,25 +53,21 @@
   size_t count1 = 0;
   size_t count2 = 0;
 
-  scheduler.scheduleEvent(500_ms, [&] {
-      ++count1;
-      BOOST_CHECK_EQUAL(count2, 1);
-    });
+  scheduler.schedule(500_ms, [&] {
+    ++count1;
+    BOOST_CHECK_EQUAL(count2, 1);
+  });
 
-  EventId i = scheduler.scheduleEvent(1_s, [&] {
-      BOOST_ERROR("This event should not have been fired");
-    });
-  scheduler.cancelEvent(i);
+  EventId i = scheduler.schedule(1_s, [] { BOOST_ERROR("This event should not have been fired"); });
+  i.cancel();
 
-  scheduler.scheduleEvent(250_ms, [&] {
-      BOOST_CHECK_EQUAL(count1, 0);
-      ++count2;
-    });
+  scheduler.schedule(250_ms, [&] {
+    BOOST_CHECK_EQUAL(count1, 0);
+    ++count2;
+  });
 
-  i = scheduler.scheduleEvent(50_ms, [&] {
-      BOOST_ERROR("This event should not have been fired");
-    });
-  scheduler.cancelEvent(i);
+  i = scheduler.schedule(50_ms, [&] { BOOST_ERROR("This event should not have been fired"); });
+  i.cancel();
 
   advanceClocks(25_ms, 1000_ms);
   BOOST_CHECK_EQUAL(count1, 1);
@@ -83,7 +79,7 @@
   class MyException : public std::exception
   {
   };
-  scheduler.scheduleEvent(10_ms, [] {
+  scheduler.schedule(10_ms, [] {
     // use plain 'throw' to ensure that Scheduler does not depend on the
     // internal machinery of NDN_THROW and that it can catch all exceptions
     // regardless of how they are thrown by the application
@@ -91,7 +87,7 @@
   });
 
   bool isCallbackInvoked = false;
-  scheduler.scheduleEvent(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
+  scheduler.schedule(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
 
   BOOST_CHECK_THROW(this->advanceClocks(6_ms, 2), MyException);
   this->advanceClocks(6_ms, 2);
@@ -101,7 +97,7 @@
 BOOST_AUTO_TEST_CASE(CancelEmptyEvent)
 {
   EventId i;
-  scheduler.cancelEvent(i);
+  i.cancel();
 
   // avoid "test case [...] did not check any assertions" message from Boost.Test
   BOOST_CHECK(true);
@@ -110,43 +106,33 @@
 BOOST_AUTO_TEST_CASE(SelfCancel)
 {
   EventId selfEventId;
-  selfEventId = scheduler.scheduleEvent(100_ms, [&] {
-      scheduler.cancelEvent(selfEventId);
-    });
-
+  selfEventId = scheduler.schedule(100_ms, [&] { selfEventId.cancel(); });
   BOOST_REQUIRE_NO_THROW(advanceClocks(100_ms, 10));
 }
 
 class SelfRescheduleFixture : public SchedulerFixture
 {
 public:
-  SelfRescheduleFixture()
-    : count(0)
-  {
-  }
-
   void
   reschedule()
   {
-    EventId eventId = scheduler.scheduleEvent(100_ms,
-                                              bind(&SelfRescheduleFixture::reschedule, this));
-    scheduler.cancelEvent(selfEventId);
+    EventId eventId = scheduler.schedule(100_ms, bind(&SelfRescheduleFixture::reschedule, this));
+    selfEventId.cancel();
     selfEventId = eventId;
 
     if (count < 5)
       count++;
     else
-      scheduler.cancelEvent(selfEventId);
+      selfEventId.cancel();
   }
 
   void
   reschedule2()
   {
-    scheduler.cancelEvent(selfEventId);
+    selfEventId.cancel();
 
     if (count < 5)  {
-      selfEventId = scheduler.scheduleEvent(100_ms,
-                                            bind(&SelfRescheduleFixture::reschedule2, this));
+      selfEventId = scheduler.schedule(100_ms, bind(&SelfRescheduleFixture::reschedule2, this));
       count++;
     }
   }
@@ -154,90 +140,70 @@
   void
   reschedule3()
   {
-    scheduler.cancelEvent(selfEventId);
+    selfEventId.cancel();
 
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
-    scheduler.scheduleEvent(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
+    scheduler.schedule(100_ms, [&] { ++count; });
   }
 
 public:
   EventId selfEventId;
-  size_t count;
+  size_t count = 0;
 };
 
 BOOST_FIXTURE_TEST_CASE(Reschedule, SelfRescheduleFixture)
 {
-  selfEventId = scheduler.scheduleEvent(0_s,
-                                        bind(&SelfRescheduleFixture::reschedule, this));
-
+  selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule, this));
   BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
-
   BOOST_CHECK_EQUAL(count, 5);
 }
 
 BOOST_FIXTURE_TEST_CASE(Reschedule2, SelfRescheduleFixture)
 {
-  selfEventId = scheduler.scheduleEvent(0_s,
-                                        bind(&SelfRescheduleFixture::reschedule2, this));
-
+  selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule2, this));
   BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
-
   BOOST_CHECK_EQUAL(count, 5);
 }
 
 BOOST_FIXTURE_TEST_CASE(Reschedule3, SelfRescheduleFixture)
 {
-  selfEventId = scheduler.scheduleEvent(0_s,
-                                        bind(&SelfRescheduleFixture::reschedule3, this));
-
+  selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule3, this));
   BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
-
   BOOST_CHECK_EQUAL(count, 6);
 }
 
 class CancelAllFixture : public SchedulerFixture
 {
 public:
-  CancelAllFixture()
-    : count(0)
-  {
-  }
-
   void
   event()
   {
     ++count;
-
-    scheduler.scheduleEvent(1_s, [&] { event(); });
+    scheduler.schedule(1_s, [&] { event(); });
   }
 
 public:
-  uint32_t count;
+  uint32_t count = 0;
 };
 
 BOOST_FIXTURE_TEST_CASE(CancelAll, CancelAllFixture)
 {
-  scheduler.scheduleEvent(500_ms, [&] { scheduler.cancelAllEvents(); });
-
-  scheduler.scheduleEvent(1_s, [&] { event(); });
-
-  scheduler.scheduleEvent(3_s, [] {
-      BOOST_ERROR("This event should have been cancelled" );
-    });
+  scheduler.schedule(500_ms, [&] { scheduler.cancelAllEvents(); });
+  scheduler.schedule(1_s, [&] { event(); });
+  scheduler.schedule(3_s, [] { BOOST_ERROR("This event should have been cancelled" ); });
 
   advanceClocks(100_ms, 100);
-
   BOOST_CHECK_EQUAL(count, 0);
 }
 
 BOOST_AUTO_TEST_CASE(CancelAllWithScopedEventId) // Bug 3691
 {
   Scheduler sched(io);
-  ScopedEventId eid = sched.scheduleEvent(10_ms, []{});
+  ScopedEventId eid = sched.schedule(10_ms, []{});
   sched.cancelAllEvents();
   eid.cancel(); // should not crash
 
@@ -263,7 +229,7 @@
   BOOST_CHECK_EQUAL(eid == eid2, true);
   BOOST_CHECK_EQUAL(eid != eid2, false);
 
-  eid = scheduler.scheduleEvent(10_ms, []{});
+  eid = scheduler.schedule(10_ms, []{});
   BOOST_CHECK_EQUAL(eid == eid2, false);
   BOOST_CHECK_EQUAL(eid != eid2, true);
 
@@ -271,7 +237,7 @@
   BOOST_CHECK_EQUAL(eid, eid2);
   BOOST_CHECK_EQUAL(eid != eid2, false);
 
-  eid2 = scheduler.scheduleEvent(10_ms, []{});
+  eid2 = scheduler.schedule(10_ms, []{});
   BOOST_CHECK_EQUAL(eid == eid2, false);
   BOOST_CHECK_NE(eid, eid2);
 }
@@ -282,12 +248,12 @@
   BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
   BOOST_CHECK_EQUAL(!eid, true);
 
-  eid = scheduler.scheduleEvent(10_ms, []{});
+  eid = scheduler.schedule(10_ms, []{});
   BOOST_CHECK_EQUAL(static_cast<bool>(eid), true);
   BOOST_CHECK_EQUAL(!eid, false);
 
   EventId eid2 = eid;
-  scheduler.cancelEvent(eid2);
+  eid2.cancel();
   BOOST_CHECK(!eid);
   BOOST_CHECK(!eid2);
 }
@@ -295,17 +261,17 @@
 BOOST_AUTO_TEST_CASE(DuringCallback)
 {
   EventId eid;
-  EventId eid2 = scheduler.scheduleEvent(20_ms, []{});
+  EventId eid2 = scheduler.schedule(20_ms, []{});
 
   bool isCallbackInvoked = false;
-  eid = scheduler.scheduleEvent(10_ms, [this, &eid, &eid2, &isCallbackInvoked] {
+  eid = scheduler.schedule(10_ms, [&eid, &eid2, &isCallbackInvoked] {
     isCallbackInvoked = true;
 
     // eid is "expired" during callback execution
     BOOST_CHECK(!eid);
     BOOST_CHECK_NE(eid, eid2);
 
-    scheduler.cancelEvent(eid2);
+    eid2.cancel();
     BOOST_CHECK_EQUAL(eid, eid2);
   });
 
@@ -316,7 +282,7 @@
 BOOST_AUTO_TEST_CASE(Reset)
 {
   bool isCallbackInvoked = false;
-  EventId eid = scheduler.scheduleEvent(10_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
+  EventId eid = scheduler.schedule(10_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
   eid.reset();
   BOOST_CHECK(!eid);
 
@@ -331,7 +297,7 @@
   EventId eid;
   BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(eid), nullString);
 
-  eid = scheduler.scheduleEvent(10_ms, []{});
+  eid = scheduler.schedule(10_ms, []{});
   BOOST_TEST_MESSAGE("eid=" << eid);
   BOOST_CHECK_NE(boost::lexical_cast<std::string>(eid), nullString);
 }
@@ -346,7 +312,7 @@
 {
   int hit = 0;
   {
-    ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
+    ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
   } // se goes out of scope
   this->advanceClocks(1_ms, 15);
   BOOST_CHECK_EQUAL(hit, 0);
@@ -355,8 +321,8 @@
 BOOST_AUTO_TEST_CASE(Assign)
 {
   int hit1 = 0, hit2 = 0;
-  ScopedEventId se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit1; });
-  se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit2; });
+  ScopedEventId se1 = scheduler.schedule(10_ms, [&] { ++hit1; });
+  se1 = scheduler.schedule(10_ms, [&] { ++hit2; });
   this->advanceClocks(1_ms, 15);
   BOOST_CHECK_EQUAL(hit1, 0);
   BOOST_CHECK_EQUAL(hit2, 1);
@@ -366,7 +332,7 @@
 {
   int hit = 0;
   {
-    ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
+    ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
     se.release();
   } // se goes out of scope
   this->advanceClocks(1_ms, 15);
@@ -378,7 +344,7 @@
   int hit = 0;
   unique_ptr<ScopedEventId> se2;
   {
-    ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
+    ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
     se2 = make_unique<ScopedEventId>(std::move(se)); // move constructor
   } // se goes out of scope
   this->advanceClocks(1_ms, 15);
@@ -386,7 +352,7 @@
 
   ScopedEventId se3;
   {
-    ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
+    ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
     se3 = std::move(se); // move assignment
   } // se goes out of scope
   this->advanceClocks(1_ms, 15);
diff --git a/tests/unit/util/time-unit-test-clock.t.cpp b/tests/unit/util/time-unit-test-clock.t.cpp
index c47bdda..b65c9f9 100644
--- a/tests/unit/util/time-unit-test-clock.t.cpp
+++ b/tests/unit/util/time-unit-test-clock.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -120,7 +120,7 @@
   ndn::Scheduler scheduler(io);
 
   bool hasFired = false;
-  scheduler.scheduleEvent(100_s, [&] { hasFired = true; });
+  scheduler.schedule(100_s, [&] { hasFired = true; });
 
   io.poll();
   BOOST_CHECK_EQUAL(hasFired, false);
