diff --git a/src/sync-policy-manager.cc b/src/sync-policy-manager.cc
index d8cb1c1..8b34856 100644
--- a/src/sync-policy-manager.cc
+++ b/src/sync-policy-manager.cc
@@ -10,10 +10,8 @@
 
 #include "sync-intro-certificate.h"
 #include "sync-logging.h"
-#include <ndn-cpp/security/identity/basic-identity-storage.hpp>
-#include <ndn-cpp/security/identity/osx-private-key-storage.hpp>
-#include <ndn-cpp/sha256-with-rsa-signature.hpp>
-#include <ndn-cpp/security/signature/sha256-with-rsa-handler.hpp>
+#include <ndn-cpp/security/verifier.hpp>
+#include <ndn-cpp/security/signature/signature-sha256-with-rsa.hpp>
 
 #include "sync-policy-manager.h"
 
@@ -27,22 +25,13 @@
 				     const Name& signingCertificateName,
 				     const Name& syncPrefix,
                                      shared_ptr<Face> face,
-                                     shared_ptr<Transport> transport,
                                      int stepLimit)
   : m_signingIdentity(signingIdentity)
   , m_signingCertificateName(signingCertificateName.getPrefix(signingCertificateName.size()-1))
   , m_syncPrefix(syncPrefix)
   , m_stepLimit(stepLimit)
-{
-  // m_transport = make_shared<TcpTransport>();
-  // m_face = make_shared<Face>(m_transport, make_shared<TcpTransport::ConnectionInfo>("localhost"));
-
-  // connectToDaemon();
-  
-  shared_ptr<IdentityStorage> publicStorage = make_shared<BasicIdentityStorage>();
-  shared_ptr<PrivateKeyStorage> privateStorage = make_shared<OSXPrivateKeyStorage>();
-  m_identityManager = make_shared<IdentityManager>(publicStorage, privateStorage);
-
+  , m_keyChain(new KeyChain())
+{  
   Name wotPrefix = syncPrefix;
   wotPrefix.append("WOT");
   m_syncPrefixRegex = Regex::fromName(syncPrefix);
@@ -55,30 +44,6 @@
 SyncPolicyManager::~SyncPolicyManager()
 {}
 
-// void
-// SyncPolicyManager::connectToDaemon()
-// {
-//   //Hack! transport does not connect to daemon unless an interest is expressed.
-//   Name name("/ndn");
-//   shared_ptr<ndn::Interest> interest = make_shared<ndn::Interest>(name);
-//   m_face->expressInterest(*interest, 
-//                           bind(&SyncPolicyManager::onConnectionData, this, _1, _2),
-//                           bind(&SyncPolicyManager::onConnectionDataTimeout, this, _1));
-// }
-
-// void
-// SyncPolicyManager::onConnectionData(const shared_ptr<const ndn::Interest>& interest,
-//                                     const shared_ptr<Data>& data)
-// {
-//   _LOG_DEBUG("onConnectionData");
-// }
-
-// void
-// SyncPolicyManager::onConnectionDataTimeout(const shared_ptr<const ndn::Interest>& interest)
-// {
-//   _LOG_DEBUG("onConnectionDataTimeout");
-// }
-
 bool 
 SyncPolicyManager::skipVerifyAndTrust (const Data& data)
 { return false; }
@@ -99,61 +64,66 @@
       return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
     }
 
-  const Sha256WithRsaSignature* sigPtr = dynamic_cast<const Sha256WithRsaSignature*> (data->getSignature());
-  if(ndn_KeyLocatorType_KEYNAME != sigPtr->getKeyLocator().getType())
-    {
-      onVerifyFailed(data);
-      return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
-    }
+  try{
+    SignatureSha256WithRsa sig(data->getSignature());
 
-  const Name& keyLocatorName = sigPtr->getKeyLocator().getKeyName();
+    const Name& keyLocatorName = sig.getKeyLocator().getName();
   
-  // if data is intro cert
-  if(m_wotPrefixRegex->match(data->getName()))
-    {
-      // _LOG_DEBUG("Intro Cert");
-      Name keyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
-      map<string, PublicKey>::const_iterator it = m_trustedIntroducers.find(keyName.toUri());
-      if(m_trustedIntroducers.end() != it)
-	{
-	  if(Sha256WithRsaHandler::verifySignature(*data, it->second))
-	    onVerified(data);
-	  else
-	    onVerifyFailed(data);
-	  return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
-	}
-      else
-	return prepareRequest(keyName, true, data, stepCount, onVerified, onVerifyFailed);
-    }
+    // if data is intro cert
+    if(m_wotPrefixRegex->match(data->getName()))
+      {
+        // _LOG_DEBUG("Intro Cert");
+        Name keyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
+        map<string, PublicKey>::const_iterator it = m_trustedIntroducers.find(keyName.toUri());
+        if(m_trustedIntroducers.end() != it)
+          {
+            if(Verifier::verifySignature(*data, sig, it->second))
+              onVerified(data);
+            else
+              onVerifyFailed(data);
+            return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
+          }
+        else
+          return prepareRequest(keyName, true, data, stepCount, onVerified, onVerifyFailed);
+      }
 
-  // if data is sync data or chat data
-  if(m_syncPrefixRegex->match(data->getName()) || m_chatDataPolicy->satisfy(*data))
-    {
-      Name keyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
+    // if data is sync data or chat data
+    if(m_syncPrefixRegex->match(data->getName()) || m_chatDataPolicy->satisfy(*data))
+      {
+        Name keyName = IdentityCertificate::certificateNameToPublicKeyName(keyLocatorName);
 
-      map<string, PublicKey>::const_iterator it = m_trustedIntroducers.find(keyName.toUri());
-      if(m_trustedIntroducers.end() != it)
-	{
-	  if(Sha256WithRsaHandler::verifySignature(*data, it->second))
-	    onVerified(data);
-	  else
-	    onVerifyFailed(data);
-	  return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
-	}
+        map<string, PublicKey>::const_iterator it = m_trustedIntroducers.find(keyName.toUri());
+        if(m_trustedIntroducers.end() != it)
+          {
+            if(Verifier::verifySignature(*data, sig, it->second))
+              onVerified(data);
+            else
+              onVerifyFailed(data);
+            return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
+          }
 
-      it = m_trustedProducers.find(keyName.toUri());
-      if(m_trustedProducers.end() != it)
-	{
-	  if(Sha256WithRsaHandler::verifySignature(*data, it->second))
-	    onVerified(data);
-	  else
-	    onVerifyFailed(data);
-	  return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
-	}
+        it = m_trustedProducers.find(keyName.toUri());
+        if(m_trustedProducers.end() != it)
+          {
+            if(Verifier::verifySignature(*data, sig, it->second))
+              onVerified(data);
+            else
+              onVerifyFailed(data);
+            return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
+          }
 
-      return prepareRequest(keyName, false, data, stepCount, onVerified, onVerifyFailed);
-    }
-  
+        return prepareRequest(keyName, false, data, stepCount, onVerified, onVerifyFailed);
+      }
+  }catch(SignatureSha256WithRsa::Error &e){
+    _LOG_DEBUG("SyncPolicyManager Error: " << e.what());
+    onVerifyFailed(data);
+    return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
+  }catch(KeyLocator::Error &e){
+    _LOG_DEBUG("SyncPolicyManager Error: " << e.what());
+    onVerifyFailed(data);
+    return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
+  }
+    
   onVerifyFailed(data);
   return SYNC_POLICY_MANAGER_NULL_VALIDATION_REQUEST_PTR;
 }
@@ -186,20 +156,6 @@
                                    const IdentityCertificate& identityCertificate,
                                    bool isIntroducer)
 {
-  // Name dataPrefix = prefix;
-  // dataPrefix.append("chronos").append(m_syncPrefix.get(-1));
-  // Ptr<Regex> dataRegex = Regex::fromName(prefix);
-  // Name certName = identityCertificate.getName();
-  // Name signerName = certName.getPrefix(certName.size()-1);
-  // Ptr<Regex> signerRegex = Regex::fromName(signerName, true);
-  
-  // SpecificPolicyRule rule(dataRegex, signerRegex);
-  // map<Name, SpecificPolicyRule>::iterator it = m_chatDataRules.find(dataPrefix);
-  // if(it != m_chatDataRules.end())
-  //   it->second = rule;
-  // else
-  //   m_chatDataRules.insert(pair <Name, SpecificPolicyRule > (dataPrefix, rule));
-
   addTrustAnchor(identityCertificate, isIntroducer);
 }
 
@@ -242,7 +198,6 @@
 
   shared_ptr<ndn::Interest> interest = make_shared<ndn::Interest>(interestName);
   // _LOG_DEBUG("send interest for intro cert: " << interest->getName());
-  interest->setChildSelector(ndn_Interest_CHILD_SELECTOR_RIGHT);
 
   OnVerified requestedCertVerifiedCallback = boost::bind(&SyncPolicyManager::onIntroCertVerified, 
                                                          this, 
@@ -281,10 +236,7 @@
   map<string, Data>::const_iterator it = m_introCert.find(prefix->toUri());
 
   if(m_introCert.end() != it)
-    {
-      Blob encodedData = it->second.wireEncode();
-      transport.send(*encodedData);
-    }
+    m_face->put(it->second);
 }
 
 void
@@ -306,17 +258,17 @@
                                                              introCertificate->getPublicKeyInfo()));
       SyncIntroCertificate syncIntroCertificate(m_syncPrefix,
                                                 introCertificate->getPublicKeyName(),
-                                                m_identityManager->getDefaultKeyNameForIdentity(m_signingIdentity),
+                                                m_keyChain->getDefaultKeyNameForIdentity(m_signingIdentity),
                                                 introCertificate->getNotBefore(),
                                                 introCertificate->getNotAfter(),
                                                 introCertificate->getPublicKeyInfo(),
                                                 SyncIntroCertificate::INTRODUCER);
 
-      Name certName = m_identityManager->getDefaultCertificateNameForIdentity(m_signingIdentity);
+      Name certName = m_keyChain->getDefaultCertificateNameForIdentity(m_signingIdentity);
       _LOG_DEBUG("Publish Intro Certificate on Verified: " << syncIntroCertificate.getName());
-      m_identityManager->signByCertificate(syncIntroCertificate, certName);
+      m_keyChain->sign(syncIntroCertificate, certName);
 
-      m_transport->send(*syncIntroCertificate.wireEncode());
+      m_face->put(syncIntroCertificate);
 
       // Name prefix = syncIntroCertificate.getName().getPrefix(syncIntroCertificate.getName().size()-1);
 
@@ -339,17 +291,17 @@
                                                            introCertificate->getPublicKeyInfo()));
       SyncIntroCertificate syncIntroCertificate(m_syncPrefix,
                                                 introCertificate->getPublicKeyName(),
-                                                m_identityManager->getDefaultKeyNameForIdentity(m_signingIdentity),
+                                                m_keyChain->getDefaultKeyNameForIdentity(m_signingIdentity),
                                                 introCertificate->getNotBefore(),
                                                 introCertificate->getNotAfter(),
                                                 introCertificate->getPublicKeyInfo(),
                                                 SyncIntroCertificate::PRODUCER);
 
-      Name certName = m_identityManager->getDefaultCertificateNameForIdentity(m_signingIdentity);
+      Name certName = m_keyChain->getDefaultCertificateNameForIdentity(m_signingIdentity);
       _LOG_DEBUG("Publish Intro Certificate on Verified: " << syncIntroCertificate.getName());
-      m_identityManager->signByCertificate(syncIntroCertificate, certName);
+      m_keyChain->sign(syncIntroCertificate, certName);
       
-      m_transport->send(*syncIntroCertificate.wireEncode());
+      m_face->put(syncIntroCertificate);
 
       // Name prefix = syncIntroCertificate.getName().getPrefix(syncIntroCertificate.getName().size()-1);
 
@@ -367,10 +319,17 @@
       //   }
     }
 
-  if(Sha256WithRsaHandler::verifySignature(*originalData, introCertificate->getPublicKeyInfo()))      
-    onVerified(originalData);    
-  else
+  try{
+    SignatureSha256WithRsa sig(originalData->getSignature());
+    if(Verifier::verifySignature(*originalData, sig, introCertificate->getPublicKeyInfo()))      
+      onVerified(originalData);    
+    else
+      onVerifyFailed(originalData);
+  }catch(SignatureSha256WithRsa::Error &e){
     onVerifyFailed(originalData);
+  }catch(KeyLocator::Error &e){
+    onVerifyFailed(originalData);
+  }
 }
 
 void 
@@ -393,7 +352,6 @@
     interestName.append("INTRODUCER");
   
   shared_ptr<ndn::Interest> interest = make_shared<ndn::Interest>(interestName);
-  interest->setChildSelector(ndn_Interest_CHILD_SELECTOR_RIGHT);
 
   OnVerified onRecursiveVerified = boost::bind(&SyncPolicyManager::onIntroCertVerified, 
                                       this, 
