diff --git a/tests/ping/client/ping.t.cpp b/tests/ping/client/ping.t.cpp
index 9f9eeb9..e39c65a 100644
--- a/tests/ping/client/ping.t.cpp
+++ b/tests/ping/client/ping.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Arizona Board of Regents.
+ * Copyright (c) 2014-2016,  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.
@@ -31,86 +31,64 @@
 
 BOOST_AUTO_TEST_SUITE(PingClientPing)
 
-class SequenceNumberIncrementFixture : public UnitTestTimeFixture
+BOOST_FIXTURE_TEST_CASE(Basic, UnitTestTimeFixture)
 {
-protected:
-  SequenceNumberIncrementFixture()
-    : face(util::makeDummyClientFace(io, {false, true}))
-    , pingOptions(makeOptions())
-    , ping(*face, pingOptions)
-    , numPings(0)
-    , lastPingSeq(pingOptions.startSeq)
-  {
-    ping.afterResponse.connect(bind(&SequenceNumberIncrementFixture::onResponse, this, _1));
-    ping.afterTimeout.connect(bind(&SequenceNumberIncrementFixture::onTimeout, this, _1));
-  }
-
-public:
-  void
-  onResponse(uint64_t seq)
-  {
-    numPings++;
-    lastPingSeq = seq;
-    if (numPings == maxPings) {
-      face->shutdown();
-      io.stop();
-    }
-  }
-
-  void
-  onTimeout(uint64_t seq)
-  {
-    numPings++;
-    lastPingSeq = seq;
-    if (numPings == maxPings) {
-      face->shutdown();
-      io.stop();
-    }
-  }
-
-private:
-  static Options
-  makeOptions()
-  {
-    Options opt;
-    opt.prefix = "ndn:/test-prefix";
-    opt.shouldAllowStaleData = false;
-    opt.shouldGenerateRandomSeq = false;
-    opt.shouldPrintTimestamp = false;
-    opt.nPings = 4;
-    opt.interval = time::milliseconds(100);
-    opt.timeout = time::milliseconds(1000);
-    opt.startSeq = 1000;
-    return opt;
-  }
-
-protected:
-  boost::asio::io_service io;
-  shared_ptr<util::DummyClientFace> face;
   Options pingOptions;
-  Ping ping;
-  uint32_t numPings;
-  uint32_t maxPings;
-  uint64_t lastPingSeq;
-  KeyChain keyChain;
-};
+  pingOptions.prefix = "ndn:/test-prefix";
+  pingOptions.shouldAllowStaleData = false;
+  pingOptions.shouldGenerateRandomSeq = false;
+  pingOptions.shouldPrintTimestamp = false;
+  pingOptions.nPings = 4;
+  pingOptions.interval = time::milliseconds(100);
+  pingOptions.timeout = time::milliseconds(2000);
+  pingOptions.startSeq = 1000;
 
-BOOST_FIXTURE_TEST_CASE(SequenceNumberIncrement, SequenceNumberIncrementFixture)
-{
-  maxPings = 4;
+  boost::asio::io_service io;
+  util::DummyClientFace face(io, {true, true});
+  Ping ping(face, pingOptions);
+
+  int nFinishSignals = 0;
+  std::vector<uint64_t> dataSeqs;
+  std::vector<uint64_t> nackSeqs;
+  std::vector<uint64_t> timeoutSeqs;
+
+  ping.afterData.connect(bind([&] (uint64_t seq) { dataSeqs.push_back(seq); }, _1));
+  ping.afterNack.connect(bind([&] (uint64_t seq) { nackSeqs.push_back(seq); }, _1));
+  ping.afterTimeout.connect(bind([&] (uint64_t seq) { timeoutSeqs.push_back(seq); }, _1));
+  ping.afterFinish.connect(bind([&] {
+    BOOST_REQUIRE_EQUAL(dataSeqs.size(), 2);
+    BOOST_REQUIRE_EQUAL(nackSeqs.size(), 1);
+    BOOST_REQUIRE_EQUAL(timeoutSeqs.size(), 1);
+
+    BOOST_CHECK_EQUAL(dataSeqs[0], 1000);
+    BOOST_CHECK_EQUAL(nackSeqs[0], 1001);
+    BOOST_CHECK_EQUAL(dataSeqs[1], 1002);
+    BOOST_CHECK_EQUAL(timeoutSeqs[0], 1003);
+
+    nFinishSignals++;
+  }));
+
   ping.start();
 
-  this->advanceClocks(io, time::milliseconds(1), 400);
+  this->advanceClocks(io, time::milliseconds(1), 500);
+  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 4);
 
-  face->receive(*makeData("ndn:/test-prefix/ping/1000"));
-  face->receive(*makeData("ndn:/test-prefix/ping/1001"));
-  face->receive(*makeData("ndn:/test-prefix/ping/1002"));
-  face->receive(*makeData("ndn:/test-prefix/ping/1003"));
+  face.receive(*makeData("ndn:/test-prefix/ping/1000"));
 
-  io.run();
+  lp::Nack nack(face.sentInterests[1]);
+  nack.setReason(lp::NackReason::DUPLICATE);
+  face.receive(nack);
 
-  BOOST_REQUIRE_EQUAL(1003, lastPingSeq);
-  BOOST_REQUIRE_EQUAL(4, numPings);
+  face.receive(*makeData("ndn:/test-prefix/ping/1002"));
+
+  this->advanceClocks(io, time::milliseconds(100), 20);
+
+  // ndn:/test-prefix/ping/1003 is unanswered and will timeout
+
+  BOOST_CHECK_EQUAL(nFinishSignals, 1);
+
+  face.shutdown();
+  io.stop();
 }
 
 BOOST_AUTO_TEST_SUITE_END()
