diff --git a/manpages/ndnpeek.rst b/manpages/ndnpeek.rst
index fe7b41a..7ebbf65 100644
--- a/manpages/ndnpeek.rst
+++ b/manpages/ndnpeek.rst
@@ -24,17 +24,14 @@
 ``-h, --help``
   Print help and exit.
 
+``-P, --prefix``
+  If specified, include ``CanBePrefix`` element in the Interest packet.
+
 ``-f, --fresh``
-  If specified, set ``MustBeFresh`` selector in the Interest packet.
+  If specified, include ``MustBeFresh`` element in the Interest packet.
 
-``-r, --rightmost``
-  Set ``ChildSelector=1`` (the rightmost child) selector.
-
-``-m, --minsuffix min``
-  Set ``min`` as the ``MinSuffixComponents`` selector.
-
-``-M, --maxsuffix max``
-  Set ``max`` as the ``MaxSuffixComponents`` selector.
+``--link-file [file]``
+  Read Link object from ``file`` and add it as ``ForwardingHint`` to the Interest packet.
 
 ``-l, --lifetime lifetime``
   Set ``lifetime`` (in milliseconds) as the ``InterestLifetime``.
@@ -51,9 +48,6 @@
 ``-V, --version``
   Print version and exit.
 
-``--link-file [file]``
-  Read Link object from ``file`` and add it to the expressed Interest.
-
 Exit Codes
 ----------
 
diff --git a/tests/peek/ndnpeek.t.cpp b/tests/peek/ndnpeek.t.cpp
index b44e7c5..e3fd5b3 100644
--- a/tests/peek/ndnpeek.t.cpp
+++ b/tests/peek/ndnpeek.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  Arizona Board of Regents.
+/*
+ * Copyright (c) 2014-2018,  Arizona Board of Regents.
  *
  * This file is part of ndn-tools (Named Data Networking Essential Tools).
  * See AUTHORS.md for complete list of ndn-tools authors and contributors.
@@ -75,16 +75,9 @@
 makeDefaultOptions()
 {
   PeekOptions opt;
-  opt.prefix = "ndn:/peek/test";
-  opt.minSuffixComponents = -1;
-  opt.maxSuffixComponents = -1;
+  opt.name = "ndn:/peek/test";
   opt.interestLifetime = DEFAULT_INTEREST_LIFETIME;
-  opt.timeout = time::milliseconds(200);
-  opt.link = nullptr;
-  opt.isVerbose = false;
-  opt.mustBeFresh = false;
-  opt.wantRightmostChild = false;
-  opt.wantPayloadOnly = false;
+  opt.timeout = 200_ms;
   return opt;
 }
 
@@ -151,57 +144,51 @@
   auto options = OutputCheck::makeOptions();
   initialize(options);
 
-  auto data = makeData(options.prefix);
+  auto data = makeData(options.name);
   std::string payload = "NdnPeekTest";
   data->setContent(reinterpret_cast<const uint8_t*>(payload.data()), payload.size());
 
   {
     CoutRedirector redir(output);
     peek->start();
-    this->advanceClocks(io, time::milliseconds(25), 4);
+    this->advanceClocks(io, 25_ms, 4);
     face.receive(*data);
   }
 
   OutputCheck::checkOutput(output, *data);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getMaxSuffixComponents(), -1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getMinSuffixComponents(), -1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
-  BOOST_CHECK(face.sentInterests.back().getForwardingHint().empty());
+  BOOST_CHECK_EQUAL(face.sentInterests.back().getCanBePrefix(), false);
   BOOST_CHECK_EQUAL(face.sentInterests.back().getMustBeFresh(), false);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getChildSelector(), DEFAULT_CHILD_SELECTOR);
+  BOOST_CHECK(face.sentInterests.back().getForwardingHint().empty());
+  BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
   BOOST_CHECK(peek->getResultCode() == ResultCode::DATA);
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(Selectors, OutputCheck, OutputChecks)
+BOOST_AUTO_TEST_CASE_TEMPLATE(NonDefault, OutputCheck, OutputChecks)
 {
   auto options = OutputCheck::makeOptions();
-  options.minSuffixComponents = 1;
-  options.maxSuffixComponents = 1;
-  options.interestLifetime = time::milliseconds(200);
+  options.canBePrefix = true;
   options.mustBeFresh = true;
-  options.wantRightmostChild = true;
+  options.interestLifetime = 200_ms;
   initialize(options);
 
-  auto data = makeData(options.prefix);
+  auto data = makeData(Name(options.name).append("suffix"));
   std::string payload = "NdnPeekTest";
   data->setContent(reinterpret_cast<const uint8_t*>(payload.data()), payload.size());
 
   {
     CoutRedirector redir(output);
     peek->start();
-    this->advanceClocks(io, time::milliseconds(25), 4);
+    this->advanceClocks(io, 25_ms, 4);
     face.receive(*data);
   }
 
   OutputCheck::checkOutput(output, *data);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getMaxSuffixComponents(), 1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getMinSuffixComponents(), 1);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), time::milliseconds(200));
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().size(), 0);
+  BOOST_CHECK_EQUAL(face.sentInterests.back().getCanBePrefix(), true);
   BOOST_CHECK_EQUAL(face.sentInterests.back().getMustBeFresh(), true);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getChildSelector(), 1);
+  BOOST_CHECK(face.sentInterests.back().getForwardingHint().empty());
+  BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), 200_ms);
   BOOST_CHECK(peek->getResultCode() == ResultCode::DATA);
 }
 
@@ -214,7 +201,7 @@
   {
     CoutRedirector redir(output);
     peek->start();
-    this->advanceClocks(io, time::milliseconds(25), 4);
+    this->advanceClocks(io, 25_ms, 4);
     nack = makeNack(face.sentInterests.at(0), lp::NackReason::NO_ROUTE);
     face.receive(nack);
   }
@@ -233,7 +220,7 @@
   {
     CoutRedirector redir(output);
     peek->start();
-    this->advanceClocks(io, time::milliseconds(25), 4);
+    this->advanceClocks(io, 25_ms, 4);
     nack = makeNack(face.sentInterests.at(0), lp::NackReason::NONE);
     face.receive(nack);
   }
@@ -253,7 +240,7 @@
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 0);
 
   peek->start();
-  this->advanceClocks(io, time::milliseconds(25), 4);
+  this->advanceClocks(io, 25_ms, 4);
 
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
   BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
@@ -262,14 +249,14 @@
 BOOST_AUTO_TEST_CASE(TimeoutLessThanLifetime)
 {
   auto options = makeDefaultOptions();
-  options.interestLifetime = time::milliseconds(200);
-  options.timeout = time::milliseconds(100);
+  options.interestLifetime = 200_ms;
+  options.timeout = 100_ms;
   initialize(options);
 
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 0);
 
   peek->start();
-  this->advanceClocks(io, time::milliseconds(25), 8);
+  this->advanceClocks(io, 25_ms, 8);
 
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
   BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
@@ -278,14 +265,14 @@
 BOOST_AUTO_TEST_CASE(TimeoutGreaterThanLifetime)
 {
   auto options = makeDefaultOptions();
-  options.interestLifetime = time::milliseconds(50);
-  options.timeout = time::milliseconds(200);
+  options.interestLifetime = 50_ms;
+  options.timeout = 200_ms;
   initialize(options);
 
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 0);
 
   peek->start();
-  this->advanceClocks(io, time::milliseconds(25), 4);
+  this->advanceClocks(io, 25_ms, 4);
 
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
   BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
diff --git a/tools/peek/ndnpeek/main.cpp b/tools/peek/ndnpeek/main.cpp
index 774d759..f04cec4 100644
--- a/tools/peek/ndnpeek/main.cpp
+++ b/tools/peek/ndnpeek/main.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2016,  Regents of the University of California,
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -50,14 +50,6 @@
 main(int argc, char* argv[])
 {
   PeekOptions options;
-  options.isVerbose = false;
-  options.mustBeFresh = false;
-  options.wantRightmostChild = false;
-  options.wantPayloadOnly = false;
-  options.minSuffixComponents = -1;
-  options.maxSuffixComponents = -1;
-  options.interestLifetime = time::milliseconds(-1);
-  options.timeout = time::milliseconds(-1);
 
   po::options_description genericOptDesc("Generic options");
   genericOptDesc.add_options()
@@ -73,18 +65,14 @@
 
   po::options_description interestOptDesc("Interest construction");
   interestOptDesc.add_options()
+    ("prefix,P", po::bool_switch(&options.canBePrefix),
+        "set CanBePrefix")
     ("fresh,f", po::bool_switch(&options.mustBeFresh),
         "set MustBeFresh")
-    ("rightmost,r", po::bool_switch(&options.wantRightmostChild),
-        "set ChildSelector to rightmost")
-    ("minsuffix,m", po::value<int>(&options.minSuffixComponents),
-        "set MinSuffixComponents")
-    ("maxsuffix,M", po::value<int>(&options.maxSuffixComponents),
-        "set MaxSuffixComponents")
+    ("link-file", po::value<std::string>(),
+        "set ForwardingHint from a file")
     ("lifetime,l", po::value<int>(),
         "set InterestLifetime (in milliseconds)")
-    ("link-file", po::value<std::string>(),
-        "set Link from a file")
   ;
 
   po::options_description visibleOptDesc;
@@ -92,13 +80,13 @@
 
   po::options_description hiddenOptDesc;
   hiddenOptDesc.add_options()
-    ("prefix", po::value<std::string>(), "Interest name");
+    ("name", po::value<std::string>(), "Interest name");
 
   po::options_description optDesc;
   optDesc.add(visibleOptDesc).add(hiddenOptDesc);
 
   po::positional_options_description optPos;
-  optPos.add("prefix", -1);
+  optPos.add("name", -1);
 
   po::variables_map vm;
   try {
@@ -120,8 +108,8 @@
     return 0;
   }
 
-  if (vm.count("prefix") > 0) {
-    options.prefix = vm["prefix"].as<std::string>();
+  if (vm.count("name") > 0) {
+    options.name = vm["name"].as<std::string>();
   }
   else {
     std::cerr << "ERROR: Interest name is missing" << std::endl;
@@ -129,18 +117,6 @@
     return 2;
   }
 
-  if (vm.count("minsuffix") > 0 && options.minSuffixComponents < 0) {
-    std::cerr << "ERROR: MinSuffixComponents must be a non-negative integer" << std::endl;
-    usage(std::cerr, visibleOptDesc);
-    return 2;
-  }
-
-  if (vm.count("maxsuffix") > 0 && options.maxSuffixComponents < 0) {
-    std::cerr << "ERROR: MaxSuffixComponents must be a non-negative integer" << std::endl;
-    usage(std::cerr, visibleOptDesc);
-    return 2;
-  }
-
   if (vm.count("lifetime") > 0) {
     if (vm["lifetime"].as<int>() >= 0) {
       options.interestLifetime = time::milliseconds(vm["lifetime"].as<int>());
diff --git a/tools/peek/ndnpeek/ndnpeek.cpp b/tools/peek/ndnpeek/ndnpeek.cpp
index 372a419..23833f1 100644
--- a/tools/peek/ndnpeek/ndnpeek.cpp
+++ b/tools/peek/ndnpeek/ndnpeek.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  Regents of the University of California,
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -37,8 +37,8 @@
   , m_timeout(options.timeout)
   , m_resultCode(ResultCode::TIMEOUT)
 {
-  if (m_timeout < time::milliseconds::zero()) {
-    m_timeout = m_options.interestLifetime < time::milliseconds::zero() ?
+  if (m_timeout < 0_ms) {
+    m_timeout = m_options.interestLifetime < 0_ms ?
                 DEFAULT_INTEREST_LIFETIME : m_options.interestLifetime;
   }
 }
@@ -68,25 +68,15 @@
 Interest
 NdnPeek::createInterest() const
 {
-  Interest interest(m_options.prefix);
-
-  if (m_options.minSuffixComponents >= 0)
-    interest.setMinSuffixComponents(m_options.minSuffixComponents);
-
-  if (m_options.maxSuffixComponents >= 0)
-    interest.setMaxSuffixComponents(m_options.maxSuffixComponents);
-
-  if (m_options.interestLifetime >= time::milliseconds::zero())
-    interest.setInterestLifetime(m_options.interestLifetime);
-
-  if (m_options.link != nullptr)
+  Interest interest(m_options.name);
+  interest.setCanBePrefix(m_options.canBePrefix);
+  interest.setMustBeFresh(m_options.mustBeFresh);
+  if (m_options.link != nullptr) {
     interest.setForwardingHint(m_options.link->getDelegationList());
-
-  if (m_options.mustBeFresh)
-    interest.setMustBeFresh(true);
-
-  if (m_options.wantRightmostChild)
-    interest.setChildSelector(1);
+  }
+  if (m_options.interestLifetime >= 0_ms) {
+    interest.setInterestLifetime(m_options.interestLifetime);
+  }
 
   if (m_options.isVerbose) {
     std::cerr << "INTEREST: " << interest << std::endl;
diff --git a/tools/peek/ndnpeek/ndnpeek.hpp b/tools/peek/ndnpeek/ndnpeek.hpp
index c8c58b9..4eac8d3 100644
--- a/tools/peek/ndnpeek/ndnpeek.hpp
+++ b/tools/peek/ndnpeek/ndnpeek.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  Regents of the University of California,
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -40,16 +40,17 @@
  */
 struct PeekOptions
 {
-  std::string prefix;
-  int minSuffixComponents;
-  int maxSuffixComponents;
-  time::milliseconds interestLifetime;
-  time::milliseconds timeout;
+  // Interest construction options
+  std::string name;
+  bool canBePrefix = false;
+  bool mustBeFresh = false;
   shared_ptr<Link> link;
-  bool isVerbose;
-  bool mustBeFresh;
-  bool wantRightmostChild;
-  bool wantPayloadOnly;
+  time::milliseconds interestLifetime = -1_ms;
+
+  // output behavior options
+  bool isVerbose = false;
+  time::milliseconds timeout = -1_ms;
+  bool wantPayloadOnly = false;
 };
 
 enum class ResultCode {
