diff --git a/nsync/sync-interest-table.cc b/nsync/sync-interest-table.cc
index 415b641..1fc1552 100644
--- a/nsync/sync-interest-table.cc
+++ b/nsync/sync-interest-table.cc
@@ -17,71 +17,71 @@
  *
  * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
  *         Chaoyi Bian <bcy@pku.edu.cn>
- *	   Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
 #include "sync-interest-table.h"
 #include "sync-logging.h"
 using namespace std;
 
-INIT_LOGGER ("SyncInterestTable");
+INIT_LOGGER("SyncInterestTable");
 
 namespace Sync
 {
 
-SyncInterestTable::SyncInterestTable (boost::asio::io_service& io, ndn::time::system_clock::Duration lifetime)
-  : m_entryLifetime (lifetime)
+SyncInterestTable::SyncInterestTable(boost::asio::io_service& io, ndn::time::system_clock::Duration lifetime)
+  : m_entryLifetime(lifetime)
   , m_scheduler(io)
 {
-  m_scheduler.schedulePeriodicEvent (ndn::time::seconds (4), ndn::time::seconds (4),
-                                     ndn::bind(&SyncInterestTable::expireInterests, this));
+  m_scheduler.scheduleEvent(ndn::time::seconds(4),
+                            ndn::bind(&SyncInterestTable::expireInterests, this));
 }
 
-SyncInterestTable::~SyncInterestTable ()
+SyncInterestTable::~SyncInterestTable()
 {
 }
 
 Interest
-SyncInterestTable::pop ()
+SyncInterestTable::pop()
 {
-  if (m_table.size () == 0)
-    BOOST_THROW_EXCEPTION (Error::InterestTableIsEmpty ());
+  if (m_table.size() == 0)
+    BOOST_THROW_EXCEPTION(Error::InterestTableIsEmpty());
 
-  Interest ret = *m_table.begin ();
-  m_table.erase (m_table.begin ());
+  Interest ret = *m_table.begin();
+  m_table.erase(m_table.begin());
 
   return ret;
 }
 
 bool
-SyncInterestTable::insert (DigestConstPtr digest, const string &name, bool unknownState/*=false*/)
+SyncInterestTable::insert(DigestConstPtr digest, const string &name, bool unknownState/*=false*/)
 {
   bool existent = false;
-  
-  InterestContainer::index<named>::type::iterator it = m_table.get<named> ().find (name);
+
+  InterestContainer::index<named>::type::iterator it = m_table.get<named>().find(name);
   if (it != m_table.end())
     {
       existent = true;
-      m_table.erase (it);
+      m_table.erase(it);
     }
-  m_table.insert (Interest (digest, name, unknownState));
+  m_table.insert(Interest(digest, name, unknownState));
 
   return existent;
 }
 
 uint32_t
-SyncInterestTable::size () const
+SyncInterestTable::size() const
 {
-  return m_table.size ();
+  return m_table.size();
 }
 
 bool
-SyncInterestTable::remove (const string &name)
+SyncInterestTable::remove(const string &name)
 {
-  InterestContainer::index<named>::type::iterator item = m_table.get<named> ().find (name);
-  if (item != m_table.get<named> ().end ())
+  InterestContainer::index<named>::type::iterator item = m_table.get<named>().find(name);
+  if (item != m_table.get<named>().end())
     {
-      m_table.get<named> ().erase (name);
+      m_table.get<named>().erase(name);
       return true;
     }
 
@@ -89,34 +89,37 @@
 }
 
 bool
-SyncInterestTable::remove (DigestConstPtr digest)
+SyncInterestTable::remove(DigestConstPtr digest)
 {
-  InterestContainer::index<hashed>::type::iterator item = m_table.get<hashed> ().find (digest);
-  if (item != m_table.get<hashed> ().end ())
+  InterestContainer::index<hashed>::type::iterator item = m_table.get<hashed>().find(digest);
+  if (item != m_table.get<hashed>().end())
     {
-      m_table.get<hashed> ().erase (digest); // erase all records associated with the digest
+      m_table.get<hashed>().erase(digest); // erase all records associated with the digest
       return true;
     }
   return false;
 }
 
-void SyncInterestTable::expireInterests ()
-{ 
+void SyncInterestTable::expireInterests()
+{
   uint32_t count = 0;
   ndn::time::system_clock::TimePoint expireTime = ndn::time::system_clock::now() - m_entryLifetime;
-  
-  while (m_table.size () > 0)
+
+  while (m_table.size() > 0)
     {
-      InterestContainer::index<timed>::type::iterator item = m_table.get<timed> ().begin ();
-      
+      InterestContainer::index<timed>::type::iterator item = m_table.get<timed>().begin();
+
       if (item->m_time <= expireTime)
         {
-          m_table.get<timed> ().erase (item);
+          m_table.get<timed>().erase(item);
           count ++;
         }
       else
         break;
   }
+
+  m_scheduler.scheduleEvent(ndn::time::seconds(4),
+                            ndn::bind(&SyncInterestTable::expireInterests, this));
 }
 
 
