diff --git a/ndn-cxx/util/notification-subscriber.cpp b/ndn-cxx/util/notification-subscriber.cpp
index f72aa58..8efc7a1 100644
--- a/ndn-cxx/util/notification-subscriber.cpp
+++ b/ndn-cxx/util/notification-subscriber.cpp
@@ -38,8 +38,8 @@
   : m_face(face)
   , m_prefix(prefix)
   , m_isRunning(false)
-  , m_lastSequenceNo(std::numeric_limits<uint64_t>::max())
-  , m_lastNackSequenceNo(std::numeric_limits<uint64_t>::max())
+  , m_lastSequenceNum(std::numeric_limits<uint64_t>::max())
+  , m_lastNackSequenceNum(std::numeric_limits<uint64_t>::max())
   , m_attempts(1)
   , m_scheduler(face.getIoService())
   , m_nackEvent(m_scheduler)
@@ -81,13 +81,8 @@
   auto interest = make_shared<Interest>(m_prefix);
   interest->setCanBePrefix(true);
   interest->setMustBeFresh(true);
-  interest->setChildSelector(1);
-  interest->setInterestLifetime(getInterestLifetime());
-
-  m_lastInterestId = m_face.expressInterest(*interest,
-                                            [this] (const auto&, const auto& d) { this->afterReceiveData(d); },
-                                            [this] (const auto&, const auto& n) { this->afterReceiveNack(n); },
-                                            [this] (const auto&) { this->afterTimeout(); });
+  interest->setInterestLifetime(m_interestLifetime);
+  sendInterest(*interest);
 }
 
 void
@@ -96,16 +91,19 @@
   if (shouldStop())
     return;
 
-  BOOST_ASSERT(m_lastSequenceNo != std::numeric_limits<uint64_t>::max()); // overflow or missing initial reply
-
   Name nextName = m_prefix;
-  nextName.appendSequenceNumber(m_lastSequenceNo + 1);
+  nextName.appendSequenceNumber(m_lastSequenceNum + 1);
 
   auto interest = make_shared<Interest>(nextName);
   interest->setCanBePrefix(false);
-  interest->setInterestLifetime(getInterestLifetime());
+  interest->setInterestLifetime(m_interestLifetime);
+  sendInterest(*interest);
+}
 
-  m_lastInterestId = m_face.expressInterest(*interest,
+void
+NotificationSubscriberBase::sendInterest(const Interest& interest)
+{
+  m_lastInterestId = m_face.expressInterest(interest,
                                             [this] (const auto&, const auto& d) { this->afterReceiveData(d); },
                                             [this] (const auto&, const auto& n) { this->afterReceiveNack(n); },
                                             [this] (const auto&) { this->afterTimeout(); });
@@ -131,7 +129,7 @@
     return;
 
   try {
-    m_lastSequenceNo = data.getName().get(-1).toSequenceNumber();
+    m_lastSequenceNum = data.getName().get(-1).toSequenceNumber();
   }
   catch (const tlv::Error&) {
     onDecodeError(data);
@@ -174,22 +172,22 @@
 time::milliseconds
 NotificationSubscriberBase::exponentialBackoff(lp::Nack nack)
 {
-  uint64_t nackSequenceNo;
+  uint64_t nackSequenceNum;
   try {
-    nackSequenceNo = nack.getInterest().getName().get(-1).toSequenceNumber();
+    nackSequenceNum = nack.getInterest().getName().get(-1).toSequenceNumber();
   }
   catch (const tlv::Error&) {
-    nackSequenceNo = 0;
+    nackSequenceNum = 0;
   }
 
-  if (m_lastNackSequenceNo == nackSequenceNo) {
+  if (m_lastNackSequenceNum == nackSequenceNum) {
     ++m_attempts;
   }
   else {
     m_attempts = 1;
   }
 
-  m_lastNackSequenceNo = nackSequenceNo;
+  m_lastNackSequenceNum = nackSequenceNum;
 
   return time::milliseconds(static_cast<time::milliseconds::rep>(std::pow(2, m_attempts) * 100 +
                                                                  random::generateWord32() % 100));
diff --git a/ndn-cxx/util/notification-subscriber.hpp b/ndn-cxx/util/notification-subscriber.hpp
index 2791ff5..3560743 100644
--- a/ndn-cxx/util/notification-subscriber.hpp
+++ b/ndn-cxx/util/notification-subscriber.hpp
@@ -88,6 +88,9 @@
   void
   sendNextInterest();
 
+  void
+  sendInterest(const Interest& interest);
+
   virtual bool
   hasSubscriber() const = 0;
 
@@ -132,8 +135,8 @@
   Face& m_face;
   Name m_prefix;
   bool m_isRunning;
-  uint64_t m_lastSequenceNo;
-  uint64_t m_lastNackSequenceNo;
+  uint64_t m_lastSequenceNum;
+  uint64_t m_lastNackSequenceNum;
   uint64_t m_attempts;
   util::scheduler::Scheduler m_scheduler;
   util::scheduler::ScopedEventId m_nackEvent;
diff --git a/tests/unit/util/notification-subscriber.t.cpp b/tests/unit/util/notification-subscriber.t.cpp
index 3fe3fd6..886e651 100644
--- a/tests/unit/util/notification-subscriber.t.cpp
+++ b/tests/unit/util/notification-subscriber.t.cpp
@@ -64,7 +64,7 @@
     data.setFreshnessPeriod(1_s);
     m_keyChain.sign(data);
 
-    lastDeliveredSeqNo = nextSendNotificationNo;
+    lastDeliveredSeqNum = nextSendNotificationNo;
     lastNotification.setMessage("");
     ++nextSendNotificationNo;
     subscriberFace.receive(data);
@@ -133,7 +133,7 @@
 
     const Interest& interest = subscriberFace.sentInterests[0];
     return interest.getName() == streamPrefix &&
-           interest.getChildSelector() == 1 &&
+           interest.getCanBePrefix() &&
            interest.getMustBeFresh() &&
            interest.getInterestLifetime() == subscriber.getInterestLifetime();
   }
@@ -142,7 +142,7 @@
    *          or 0 if there's no such request as sole sent Interest
    */
   uint64_t
-  getRequestSeqNo() const
+  getRequestSeqNum() const
   {
     if (subscriberFace.sentInterests.size() != 1)
       return 0;
@@ -164,7 +164,7 @@
   util::signal::Connection notificationConn;
   util::signal::Connection nackConn;
   uint64_t nextSendNotificationNo;
-  uint64_t lastDeliveredSeqNo;
+  uint64_t lastDeliveredSeqNum;
   SimpleNotification lastNotification;
   lp::Nack lastNack;
   bool hasTimeout;
@@ -205,14 +205,14 @@
   this->deliverNotification("n1");
   advanceClocks(1_ms);
   BOOST_CHECK_EQUAL(lastNotification.getMessage(), "n1");
-  BOOST_CHECK_EQUAL(this->getRequestSeqNo(), lastDeliveredSeqNo + 1);
+  BOOST_CHECK_EQUAL(this->getRequestSeqNum(), lastDeliveredSeqNum + 1);
 
   // respond to continuation request
   subscriberFace.sentInterests.clear();
   this->deliverNotification("n2");
   advanceClocks(1_ms);
   BOOST_CHECK_EQUAL(lastNotification.getMessage(), "n2");
-  BOOST_CHECK_EQUAL(this->getRequestSeqNo(), lastDeliveredSeqNo + 1);
+  BOOST_CHECK_EQUAL(this->getRequestSeqNum(), lastDeliveredSeqNum + 1);
 }
 
 BOOST_AUTO_TEST_CASE(Nack)
