diff --git a/tests/unit-tests/security/test-certificate-cache.cpp b/tests/unit-tests/security/test-certificate-cache.cpp
index 2934a47..d98dd4a 100644
--- a/tests/unit-tests/security/test-certificate-cache.cpp
+++ b/tests/unit-tests/security/test-certificate-cache.cpp
@@ -21,79 +21,130 @@
 
 #include "security/certificate-cache-ttl.hpp"
 #include "face.hpp"
+#include "util/time-unit-test-clock.hpp"
 
 #include "boost-test.hpp"
 
-using namespace std;
-
 namespace ndn {
+namespace tests {
 
 BOOST_AUTO_TEST_SUITE(SecurityTestCertificateCache)
 
-void
-getCertificateTtl(shared_ptr<CertificateCacheTtl> cache, const Name &name, bool cached)
+class UnitTestTimeFixture
 {
-  BOOST_CHECK_EQUAL(static_cast<bool>(cache->getCertificate(name)), cached);
-}
+public:
+  UnitTestTimeFixture()
+    : steadyClock(make_shared<time::UnitTestSteadyClock>())
+    , scheduler(io)
+    , cache(make_shared<CertificateCacheTtl>(ref(io), time::seconds(1)))
+  {
+    time::setCustomClocks(steadyClock);
 
-void
-checkSize(shared_ptr<CertificateCacheTtl> cache, size_t size)
-{
-  BOOST_CHECK_EQUAL(cache->getSize(), size);
-}
+    cert1 = make_shared<IdentityCertificate>();
+    Name certName1("/tmp/KEY/ksk-1/ID-CERT/1");
+    cert1->setName(certName1);
+    cert1->setFreshnessPeriod(time::milliseconds(500));
 
+    cert2 = make_shared<IdentityCertificate>();
+    Name certName2("/tmp/KEY/ksk-2/ID-CERT/2");
+    cert2->setName(certName2);
+    cert2->setFreshnessPeriod(time::milliseconds(1000));
 
-BOOST_AUTO_TEST_CASE (Ttl)
-{
+    name1 = certName1.getPrefix(-1);
+    name2 = certName2.getPrefix(-1);
+  }
+
+  ~UnitTestTimeFixture()
+  {
+    time::setCustomClocks(nullptr, nullptr);
+  }
+
+public:
+  shared_ptr<time::UnitTestSteadyClock> steadyClock;
+
   boost::asio::io_service io;
-  shared_ptr<CertificateCacheTtl> cache =
-    make_shared<CertificateCacheTtl>(ref(io), time::seconds(1));
-  Scheduler scheduler(io);
+  Scheduler scheduler;
 
-  shared_ptr<IdentityCertificate> cert1 = make_shared<IdentityCertificate>();
-  Name certName1("/tmp/KEY/ksk-1/ID-CERT/1");
-  cert1->setName(certName1);
-  cert1->setFreshnessPeriod(time::milliseconds(500));
-  shared_ptr<IdentityCertificate> cert2 = make_shared<IdentityCertificate>();
-  Name certName2("/tmp/KEY/ksk-2/ID-CERT/2");
-  cert2->setName(certName2);
-  cert2->setFreshnessPeriod(time::milliseconds(1000));
+  shared_ptr<CertificateCacheTtl> cache;
 
-  Name name1 = certName1.getPrefix(-1);
-  Name name2 = certName2.getPrefix(-1);
+  shared_ptr<IdentityCertificate> cert1;
+  shared_ptr<IdentityCertificate> cert2;
 
+  Name name1;
+  Name name2;
+};
+
+
+BOOST_FIXTURE_TEST_CASE(Expiration, UnitTestTimeFixture)
+{
   cache->insertCertificate(cert1);
   cache->insertCertificate(cert2);
 
-  scheduler.scheduleEvent(time::milliseconds(200), bind(&checkSize, cache, 2));
-  scheduler.scheduleEvent(time::milliseconds(200), bind(&getCertificateTtl, cache, name1, true));
-  scheduler.scheduleEvent(time::milliseconds(200), bind(&getCertificateTtl, cache, name2, true));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 2);
+
+  scheduler.scheduleEvent(time::milliseconds(200), [&] {
+      BOOST_CHECK_EQUAL(cache->getSize(), 2);
+      BOOST_CHECK_EQUAL(static_cast<bool>(cache->getCertificate(name1)), true);
+      BOOST_CHECK_EQUAL(static_cast<bool>(cache->getCertificate(name2)), true);
+    });
+
+  steadyClock->advance(time::milliseconds(200));
+  io.poll();
 
   // cert1 should removed from the cache
-  scheduler.scheduleEvent(time::milliseconds(900), bind(&checkSize, cache, 1));
-  scheduler.scheduleEvent(time::milliseconds(900), bind(&getCertificateTtl, cache, name1, false));
-  scheduler.scheduleEvent(time::milliseconds(900), bind(&getCertificateTtl, cache, name2, true));
+  scheduler.scheduleEvent(time::milliseconds(700), [&] {
+      BOOST_CHECK_EQUAL(static_cast<bool>(cache->getCertificate(name1)), false);
+      BOOST_CHECK_EQUAL(static_cast<bool>(cache->getCertificate(name2)), true);
+    });
 
-  // Refresh certificate in cache
-  scheduler.scheduleEvent(time::milliseconds(900), bind(&CertificateCache::insertCertificate,
-                                                        cache, cert2));
-  scheduler.scheduleEvent(time::milliseconds(1500), bind(&getCertificateTtl, cache, name2, true));
-  scheduler.scheduleEvent(time::milliseconds(2500), bind(&getCertificateTtl, cache, name2, false));
+  steadyClock->advance(time::milliseconds(700));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 1);
 
-  // Purge
-  scheduler.scheduleEvent(time::milliseconds(3000), bind(&CertificateCache::insertCertificate,
-                                                         cache, cert1));
-  scheduler.scheduleEvent(time::milliseconds(3000), bind(&CertificateCache::insertCertificate,
-                                                         cache, cert2));
-  scheduler.scheduleEvent(time::milliseconds(3100), bind(&checkSize, cache, 2));
-  scheduler.scheduleEvent(time::milliseconds(3200), bind(&CertificateCache::reset, cache));
-  scheduler.scheduleEvent(time::milliseconds(3300), bind(&getCertificateTtl, cache, name1, false));
-  scheduler.scheduleEvent(time::milliseconds(3300), bind(&getCertificateTtl, cache, name2, false));
-  scheduler.scheduleEvent(time::milliseconds(3400), bind(&checkSize, cache, 0));
+  steadyClock->advance(time::milliseconds(700));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 0);
+}
 
-  io.run();
+BOOST_FIXTURE_TEST_CASE(TtlRefresh, UnitTestTimeFixture)
+{
+  cache->insertCertificate(cert1); // 500ms
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 1);
+
+  steadyClock->advance(time::milliseconds(400));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 1);
+
+    // Refresh certificate in cache
+  cache->insertCertificate(cert1); // +500ms
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 1);
+
+  steadyClock->advance(time::milliseconds(400));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 1);
+
+  steadyClock->advance(time::milliseconds(200));
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 0);
+}
+
+BOOST_FIXTURE_TEST_CASE(Reset, UnitTestTimeFixture)
+{
+  cache->insertCertificate(cert1);
+  cache->insertCertificate(cert2);
+
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 2);
+
+  cache->reset();
+  io.poll();
+  BOOST_CHECK_EQUAL(cache->getSize(), 0);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
 
+} // namespace tests
 } // namespace ndn
