diff --git a/src/sync-logic.cc b/src/sync-logic.cc
index 6f3d21d..ec4d63e 100644
--- a/src/sync-logic.cc
+++ b/src/sync-logic.cc
@@ -79,7 +79,7 @@
 { 
   m_syncRegisteredPrefixId = m_face->setInterestFilter (m_syncPrefix, 
                                                         bind(&SyncLogic::onSyncInterest, this, _1, _2), 
-                                                        bind(&SyncLogic::onSyncRegisterFailed, this, _1));
+                                                        bind(&SyncLogic::onSyncRegisterFailed, this, _1, _2));
   
 
   m_reexpressingInterestId = m_scheduler.scheduleEvent (time::seconds (0), // no need to add jitter
@@ -108,7 +108,7 @@
 { 
   m_syncRegisteredPrefixId = m_face->setInterestFilter (m_syncPrefix, 
                                                         bind(&SyncLogic::onSyncInterest, this, _1, _2), 
-                                                        bind(&SyncLogic::onSyncRegisterFailed, this, _1));
+                                                        bind(&SyncLogic::onSyncRegisterFailed, this, _1, _2));
 
   m_reexpressingInterestId = m_scheduler.scheduleEvent (time::seconds (0), // no need to add jitter
                                                         bind (&SyncLogic::sendSyncInterest, this));
@@ -117,12 +117,6 @@
 SyncLogic::~SyncLogic ()
 { 
   m_face->unsetInterestFilter(m_syncRegisteredPrefixId); 
-}
-
-void
-SyncLogic::stop()
-{
-  m_face->unsetInterestFilter(m_syncRegisteredPrefixId);
   m_scheduler.cancelEvent (m_reexpressingInterestId);
   m_scheduler.cancelEvent (m_delayedInterestProcessingId);
 }
@@ -160,10 +154,9 @@
 }
 
 void
-SyncLogic::onSyncInterest (const shared_ptr<const Name>& prefix, 
-                           const shared_ptr<const ndn::Interest>& interest)
+SyncLogic::onSyncInterest (const Name& prefix, const ndn::Interest& interest)
 {
-  Name name = interest->getName();
+  Name name = interest.getName();
 
   _LOG_DEBUG_ID("respondSyncInterest: " << name);
 
@@ -193,20 +186,21 @@
 }
 
 void
-SyncLogic::onSyncRegisterFailed(const shared_ptr<const Name>& prefix)
+SyncLogic::onSyncRegisterFailed(const Name& prefix, const string& msg)
 {
-  _LOG_DEBUG_ID("Sync prefix registration failed!");
+  _LOG_DEBUG_ID("Sync prefix registration failed! " << msg);
 }
 
 void
-SyncLogic::onSyncData(const shared_ptr<const ndn::Interest>& interest, 
-                      const shared_ptr<Data>& data,
-                      const OnDataValidated& onValidated,
-                      const OnDataValidationFailed& onValidationFailed)
-{ m_validator->validate(data, onValidated, onValidationFailed); }
+SyncLogic::onSyncData(const ndn::Interest& interest, Data& data)
+{
+  OnDataValidated onValidated = bind(&SyncLogic::onSyncDataValidated, this, _1);
+  OnDataValidationFailed onValidationFailed = bind(&SyncLogic::onSyncDataValidationFailed, this, _1);
+  m_validator->validate(data, onValidated, onValidationFailed); 
+}
 
 void
-SyncLogic::onSyncTimeout(const shared_ptr<const ndn::Interest>& interest)
+SyncLogic::onSyncTimeout(const ndn::Interest& interest)
 { 
   // It is OK. Others will handle the time out situation. 
 }
@@ -588,11 +582,8 @@
   ndn::Interest interest(m_outstandingInterestName);
   interest.setMustBeFresh(true);
 
-  OnDataValidated onValidated = bind(&SyncLogic::onSyncDataValidated, this, _1);
-  OnDataValidationFailed onValidationFailed = bind(&SyncLogic::onSyncDataValidationFailed, this, _1);
-
   m_face->expressInterest(interest,
-                          bind(&SyncLogic::onSyncData, this, _1, _2, onValidated, onValidationFailed),
+                          bind(&SyncLogic::onSyncData, this, _1, _2),
                           bind(&SyncLogic::onSyncTimeout, this, _1));
 }
 
@@ -617,11 +608,8 @@
   ndn::Interest interest(interestName);
   interest.setMustBeFresh(true);
 
-  OnDataValidated onValidated = bind(&SyncLogic::onSyncDataValidated, this, _1);
-  OnDataValidationFailed onValidationFailed = bind(&SyncLogic::onSyncDataValidationFailed, this, _1);
-
   m_face->expressInterest(interest,
-                          bind(&SyncLogic::onSyncData, this, _1, _2, onValidated, onValidationFailed),
+                          bind(&SyncLogic::onSyncData, this, _1, _2),
                           bind(&SyncLogic::onSyncTimeout, this, _1));
 }
 
diff --git a/src/sync-logic.h b/src/sync-logic.h
index 5c3abe4..fc63fca 100644
--- a/src/sync-logic.h
+++ b/src/sync-logic.h
@@ -95,19 +95,6 @@
   void addLocalNames (const ndn::Name &prefix, uint64_t session, uint64_t seq);
 
   /**
-   * @brief respond to the Sync Interest; a lot of logic needs to go in here
-   * @param interest the Sync Interest in string format
-   */
-  void respondSyncInterest (ndn::shared_ptr<ndn::Interest> interest);
-
-  /**
-   * @brief process the fetched sync data
-   * @param name the data name
-   * @param dataBuffer the sync data
-   */
-  void respondSyncData (ndn::shared_ptr<ndn::Data> data);
-
-  /**
    * @brief remove a participant's subtree from the sync tree
    * @param prefix the name prefix for the participant
    */
@@ -120,8 +107,6 @@
   ndn::Scheduler &
   getScheduler () { return m_scheduler; }
 #endif
-  
-  void stop();
 
   void
   printState () const;
@@ -134,20 +119,16 @@
   delayedChecksLoop ();
 
   void
-  onSyncInterest (const ndn::shared_ptr<const ndn::Name>& prefix, 
-                  const ndn::shared_ptr<const ndn::Interest>& interest);
+  onSyncInterest (const ndn::Name& prefix, const ndn::Interest& interest);
 
   void
-  onSyncRegisterFailed(const ndn::shared_ptr<const ndn::Name>& prefix);
+  onSyncRegisterFailed(const ndn::Name& prefix, const std::string& msg);
 
   void
-  onSyncData(const ndn::shared_ptr<const ndn::Interest>& interest, 
-             const ndn::shared_ptr<ndn::Data>& data,
-             const ndn::OnDataValidated& onValidated,
-             const ndn::OnDataValidationFailed& onValidationFailed);
+  onSyncData(const ndn::Interest& interest, ndn::Data& data);
 
   void
-  onSyncTimeout(const ndn::shared_ptr<const ndn::Interest>& interest);
+  onSyncTimeout(const ndn::Interest& interest);
 
   void
   onSyncDataValidationFailed(const ndn::shared_ptr<const ndn::Data>& data);
diff --git a/src/sync-socket.cc b/src/sync-socket.cc
index cb41b30..f590338 100644
--- a/src/sync-socket.cc
+++ b/src/sync-socket.cc
@@ -39,6 +39,7 @@
   , m_validator(validator)
   , m_keyChain(new KeyChain())
   , m_face(face)
+  , m_ioService(face->ioService())
   , m_syncLogic (syncPrefix,
                  validator,
                  face,
@@ -53,23 +54,30 @@
 bool 
 SyncSocket::publishData(const Name &prefix, uint64_t session, const char *buf, size_t len, int freshness)
 {
+  shared_ptr<Data> data = make_shared<Data>();
+  data->setContent(reinterpret_cast<const uint8_t*>(buf), len);
+  data->setFreshnessPeriod(1000*freshness);
+
+  m_ioService->post(bind(&SyncSocket::publishDataInternal, this, data, prefix, session));
+
+  return true;  
+}
+
+void
+SyncSocket::publishDataInternal(shared_ptr<Data> data, const Name &prefix, uint64_t session)
+{
   uint64_t sequence = getNextSeq(prefix, session);
-  
   Name dataName = prefix;
   dataName.append(boost::lexical_cast<string>(session)).append(boost::lexical_cast<string>(sequence));
+  data->setName(dataName);
 
-  Data data(dataName);
-  data.setContent(reinterpret_cast<const uint8_t*>(buf), len);
-  data.setFreshnessPeriod(1000*freshness);
+  m_keyChain->sign(*data);  
+  m_face->put(*data);
 
-  m_keyChain->sign(data);
-  
-  m_face->put(data);
-  
   SeqNo s(session, sequence + 1);
+
   m_sequenceLog[prefix] = s;
   m_syncLogic.addLocalNames (prefix, session, sequence);
-  return true;
 }
 
 void 
@@ -89,8 +97,7 @@
 }
 
 void
-SyncSocket::onData(const shared_ptr<const ndn::Interest>& interest, 
-                   const shared_ptr<Data>& data,
+SyncSocket::onData(const ndn::Interest& interest, Data& data,
                    const OnDataValidated& onValidated,
                    const OnDataValidationFailed& onValidationFailed)
 {
@@ -98,14 +105,14 @@
 }
 
 void
-SyncSocket::onDataTimeout(const shared_ptr<const ndn::Interest>& interest, 
+SyncSocket::onDataTimeout(const ndn::Interest& interest, 
                           int retry,
                           const OnDataValidated& onValidated,
                           const OnDataValidationFailed& onValidationFailed)
 {
   if(retry > 0)
     {
-      m_face->expressInterest(*interest,
+      m_face->expressInterest(interest,
                               bind(&SyncSocket::onData,
                                    this,
                                    _1,
diff --git a/src/sync-socket.h b/src/sync-socket.h
index 35fd8ed..ee02ae8 100644
--- a/src/sync-socket.h
+++ b/src/sync-socket.h
@@ -91,18 +91,20 @@
   GetLocalPrefix (); 
   
 private:
+  void
+  publishDataInternal(ndn::shared_ptr<ndn::Data> data, const ndn::Name &prefix, uint64_t session);
+
   void 
   passCallback(const std::vector<MissingDataInfo> &v) 
   { m_newDataCallback(v, this); }
 
   void
-  onData(const ndn::shared_ptr<const ndn::Interest>& interest, 
-         const ndn::shared_ptr<ndn::Data>& data,
+  onData(const ndn::Interest& interest, ndn::Data& data,
          const ndn::OnDataValidated& onValidated,
          const ndn::OnDataValidationFailed& onValidationFailed);
 
   void
-  onDataTimeout(const ndn::shared_ptr<const ndn::Interest>& interest, 
+  onDataTimeout(const ndn::Interest& interest, 
                 int retry,
                 const ndn::OnDataValidated& onValidated,
                 const ndn::OnDataValidationFailed& onValidationFailed);
@@ -117,6 +119,7 @@
   ndn::shared_ptr<ndn::Validator> m_validator;
   ndn::shared_ptr<ndn::KeyChain> m_keyChain;
   ndn::shared_ptr<ndn::Face> m_face;
+  ndn::shared_ptr<boost::asio::io_service> m_ioService;
   SyncLogic      m_syncLogic;
 };
 
diff --git a/tests/test_socket.cc b/tests/test_socket.cc
index fd17c44..60a87f3 100644
--- a/tests/test_socket.cc
+++ b/tests/test_socket.cc
@@ -138,14 +138,14 @@
 class TestSet1{
 public:
   TestSet1(ndn::shared_ptr<boost::asio::io_service> ioService)
-    : m_syncPrefix("/let/us/sync")
-    , m_validator(new ndn::ValidatorNull())
+    : m_validator(new ndn::ValidatorNull())
     , m_face1(new ndn::Face(ioService))
     , m_face2(new ndn::Face(ioService))
     , m_face3(new ndn::Face(ioService))
     , m_p1("/irl.cs.ucla.edu")
     , m_p2("/yakshi.org")
     , m_p3("/google.com")
+    , m_syncPrefix("/let/us/sync")
   {}
 
   void
@@ -250,12 +250,12 @@
 class TestSet2{
 public:
   TestSet2(ndn::shared_ptr<boost::asio::io_service> ioService)
-    : m_syncPrefix("/this/is/the/prefix")
-    , m_validator(new ndn::ValidatorNull())
+    : m_validator(new ndn::ValidatorNull())
     , m_face1(new ndn::Face(ioService))
     , m_face2(new ndn::Face(ioService))
     , m_p1("/xiaonei.com")
     , m_p2("/mitbbs.com")
+    , m_syncPrefix("/this/is/the/prefix")
   {}
 
   void
