diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 49216c8..bdae08c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -22,7 +22,6 @@
 
     steps:
     - uses: actions/checkout@v2
-
     - name: Run build script
       run: |
         ./.jenkins
@@ -33,16 +32,14 @@
 
     steps:
     - uses: actions/checkout@v2
-
     - name: Run build script
       run: |
-        sudo apt install -y software-properties-common
+        sudo apt-get -qy install software-properties-common
         sudo add-apt-repository ppa:named-data/ppa -y
-        sudo apt update
-        sudo apt-get install nfd libndn-cxx-dev libchronosync-dev
-        sudo apt-get install libcrypto++-dev libboost-all-dev qt5-default
+        sudo apt-get -qq update
+        sudo apt-get -qy install nfd libndn-cxx-dev libchronosync-dev libboost-all-dev libsqlite3-dev qt5-default
         ./waf --color=yes configure --debug
-        ./waf --color=yes build -j4
+        ./waf --color=yes build -j$(nproc)
 
   macos:
     runs-on: ${{ matrix.os }}
@@ -60,7 +57,6 @@
 
     steps:
     - uses: actions/checkout@v2
-
     - name: Run build script
       run: |
         sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer
diff --git a/.jenkins.d/00-deps.sh b/.jenkins.d/00-deps.sh
index 34d006e..32278a1 100755
--- a/.jenkins.d/00-deps.sh
+++ b/.jenkins.d/00-deps.sh
@@ -8,20 +8,16 @@
     fi
 
     if [[ -n $GITHUB_ACTIONS ]]; then
-        # Homebrew doesn't have cryptopp packages, so build from source
-        git clone https://github.com/weidai11/cryptopp/
-        cd cryptopp
-        make -j4
-        make install
-        cd ..
-
-        # Travis images come with a large number of pre-installed
-        # brew packages, don't waste time upgrading all of them
+        # Don't waste time upgrading all pre-installed packages
         for FORMULA in "${FORMULAE[@]}"; do
             brew list --versions "$FORMULA" || brew install "$FORMULA"
         done
 
-        brew link qt --force
+        # Ensure /usr/local/opt/openssl exists
+        brew reinstall openssl
+
+        # Homebrew qt is keg-only, force symlinking it into /usr/local
+        brew link --force qt
     else
         brew update
         brew upgrade
@@ -31,7 +27,7 @@
 
 elif has Ubuntu $NODE_LABELS; then
     sudo apt-get -qq update
-    sudo apt-get -qy install g++ pkg-config python3-minimal \
+    sudo apt-get -qy install build-essential pkg-config python3-minimal \
                              libboost-all-dev libssl-dev libsqlite3-dev \
-                             libcrypto++-dev qt5-default
-fi
\ No newline at end of file
+                             qt5-default
+fi
diff --git a/.waf-tools/cryptopp.py b/.waf-tools/cryptopp.py
deleted file mode 100644
index b61c0bf..0000000
--- a/.waf-tools/cryptopp.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#! /usr/bin/env python
-# encoding: utf-8
-
-'''
-
-When using this tool, the wscript will look like:
-
-	def options(opt):
-	        opt.tool_options('cryptopp', tooldir=["waf-tools"])
-
-	def configure(conf):
-		conf.load('compiler_cxx cryptopp')
-
-	def build(bld):
-		bld(source='main.cpp', target='app', use='CRYPTOPP')
-
-Options are generated, in order to specify the location of cryptopp includes/libraries.
-
-
-'''
-import sys
-import re
-from waflib import Utils,Logs,Errors
-from waflib.Configure import conf
-CRYPTOPP_DIR=['/usr','/usr/local','/opt/local','/sw']
-CRYPTOPP_VERSION_FILE='config.h'
-CRYPTOPP_VERSION_CODE='''
-#include <iostream>
-#include <cryptopp/config.h>
-int main() { std::cout << CRYPTOPP_VERSION; }
-'''
-
-def options(opt):
-	opt.add_option('--cryptopp',type='string',default='',dest='cryptopp_dir',help='''path to where cryptopp is installed, e.g. /opt/local''')
-@conf
-def __cryptopp_get_version_file(self,dir):
-	try:
-		return self.root.find_dir(dir).find_node('%s/%s' % ('include/cryptopp', CRYPTOPP_VERSION_FILE))
-	except:
-		return None
-@conf
-def cryptopp_get_version(self,dir):
-	val=self.check_cxx(fragment=CRYPTOPP_VERSION_CODE,includes=['%s/%s' % (dir, 'include')], execute=True, define_ret = True, mandatory=True)
-	return val
-@conf
-def cryptopp_get_root(self,*k,**kw):
-	root=k and k[0]or kw.get('path',None)
-	# Logs.pprint ('RED', '   %s' %root)
-	if root and self.__cryptopp_get_version_file(root):
-		return root
-	for dir in CRYPTOPP_DIR:
-		if self.__cryptopp_get_version_file(dir):
-			return dir
-	if root:
-		self.fatal('CryptoPP not found in %s'%root)
-	else:
-		self.fatal('CryptoPP not found, please provide a --cryptopp argument (see help)')
-@conf
-def check_cryptopp(self,*k,**kw):
-	if not self.env['CXX']:
-		self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
-
-	var=kw.get('uselib_store','CRYPTOPP')
-	self.start_msg('Checking CRYPTOPP')
-	root = self.cryptopp_get_root(*k,**kw)
-	self.env.CRYPTOPP_VERSION=self.cryptopp_get_version(root)
-
-	self.env['INCLUDES_%s'%var]= '%s/%s' % (root, "include")
-	self.env['LIB_%s'%var] = "cryptopp"
-	self.env['LIBPATH_%s'%var] = '%s/%s' % (root, "lib")
-
-	self.end_msg(self.env.CRYPTOPP_VERSION)
-	if Logs.verbose:
-		Logs.pprint('CYAN','	CRYPTOPP include : %s'%self.env['INCLUDES_%s'%var])
-		Logs.pprint('CYAN','	CRYPTOPP lib     : %s'%self.env['LIB_%s'%var])
-		Logs.pprint('CYAN','	CRYPTOPP libpath : %s'%self.env['LIBPATH_%s'%var])
-
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
index 7a317b1..d3246e1 100644
--- a/.waf-tools/default-compiler-flags.py
+++ b/.waf-tools/default-compiler-flags.py
@@ -151,12 +151,12 @@
                               '-Wextra',
                               '-Werror',
                               '-Wcatch-value=2',
-                              # '-Wextra-semi', # prevent noisy output with Qt5
+                              #'-Wextra-semi', # Qt5
                               '-Wnon-virtual-dtor',
                               '-Wno-error=deprecated-declarations', # Bug #3795
                               '-Wno-error=maybe-uninitialized', # Bug #1615
+                              '-Wno-deprecated-copy', # Qt5
                               '-Wno-unused-parameter',
-                              '-Wno-error=deprecated-copy', # Qt5
                               ]
         flags['LINKFLAGS'] += ['-Wl,-O1']
         return flags
@@ -169,8 +169,9 @@
                               '-Wall',
                               '-Wextra',
                               '-Wcatch-value=2',
-                              '-Wextra-semi',
+                              #'-Wextra-semi', # Qt5
                               '-Wnon-virtual-dtor',
+                              '-Wno-deprecated-copy', # Qt5
                               '-Wno-unused-parameter',
                               ]
         flags['LINKFLAGS'] += ['-Wl,-O1']
@@ -180,7 +181,7 @@
     def getDebugFlags(self, conf):
         flags = super(GccFlags, self).getDebugFlags(conf)
         flags['CXXFLAGS'] += ['-fdiagnostics-color',
-                              '-Wredundant-tags',
+                              #'-Wredundant-tags', # Qt5
                               ]
         if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
             flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
@@ -189,7 +190,7 @@
     def getOptimizedFlags(self, conf):
         flags = super(GccFlags, self).getOptimizedFlags(conf)
         flags['CXXFLAGS'] += ['-fdiagnostics-color',
-                              '-Wredundant-tags',
+                              #'-Wredundant-tags', # Qt5
                               ]
         if platform.machine() == 'armv7l' and self.getCompilerVersion(conf) >= (7, 1, 0):
             flags['CXXFLAGS'] += ['-Wno-psabi'] # Bug #5106
@@ -225,4 +226,4 @@
                               ]
         if self.getCompilerVersion(conf) < (6, 0, 0):
             flags['CXXFLAGS'] += ['-Wno-missing-braces'] # Bug #4721
-        return flags
\ No newline at end of file
+        return flags
diff --git a/README.md b/README.md
index 3737987..f7a4779 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-ChronoChat
-==========
+# ChronoChat
 
 ChronoChat is a multiparty chat application that demostrates our synchronization primitive that we call ChronoSync.
 
@@ -12,10 +11,9 @@
 
 ## Compilation steps
 
-1. On Ubuntu, configure [NDN PPA repository](http://named-data.net/doc/NFD/current/FAQ.html#how-to-start-using-ndn-ppa-repository-on-ubuntu-linux) and install NFD and ChronoSYnc if you don't have it yet, then install dependencies
+1. On Ubuntu, configure the [NDN PPA repository](http://named-data.net/doc/NFD/current/FAQ.html#how-to-start-using-ndn-ppa-repository-on-ubuntu-linux) and install the necessary dependencies
 
-        sudo apt-get install nfd libndn-cxx-dev libchronosync-dev
-        sudo apt-get install libcrypto++-dev libboost-all-dev qt5-default
+        sudo apt install nfd libndn-cxx-dev libchronosync-dev libboost-all-dev libsqlite3-dev qt5-default
 
 2. Fetch source code
 
diff --git a/src/chat-dialog-backend.cpp b/src/chat-dialog-backend.cpp
index 53bfdb3..ff0a600 100644
--- a/src/chat-dialog-backend.cpp
+++ b/src/chat-dialog-backend.cpp
@@ -15,18 +15,16 @@
 
 #ifndef Q_MOC_RUN
 #include <boost/iostreams/stream.hpp>
-#include <ndn-cxx/util/io.hpp>
-#include "cryptopp.hpp"
-#endif
 
-using namespace CryptoPP;
+#include <ndn-cxx/util/io.hpp>
+#include <ndn-cxx/util/string-helper.hpp>
+#endif
 
 namespace chronochat {
 
 static const time::milliseconds FRESHNESS_PERIOD(60000);
 static const time::seconds HELLO_INTERVAL(60);
-static const ndn::Name::Component ROUTING_HINT_SEPARATOR =
-  ndn::name::Component::fromEscapedString("%F0%2E");
+static const Name::Component ROUTING_HINT_SEPARATOR = Name::Component::fromEscapedString("%F0%2E");
 static const int IDENTITY_OFFSET = -3;
 static const int CONNECTION_RETRY_TIMER = 3;
 
@@ -49,10 +47,7 @@
   updatePrefixes();
 }
 
-
-ChatDialogBackend::~ChatDialogBackend()
-{
-}
+ChatDialogBackend::~ChatDialogBackend() = default;
 
 // protected methods:
 void
@@ -101,8 +96,6 @@
     close();
 
   } while (shouldResume);
-
-  std::cerr << "Bye!" << std::endl;
 }
 
 // private methods:
@@ -183,7 +176,6 @@
 
   std::vector<NodeInfo> nodeInfos;
 
-
   for (size_t i = 0; i < updates.size(); i++) {
     // update roster
     if (m_roster.find(updates[i].session) == m_roster.end()) {
@@ -214,13 +206,11 @@
 
   // reflect the changes on GUI
   emit syncTreeUpdated(nodeInfos,
-                       QString::fromStdString(getHexEncodedDigest(m_sock->getRootDigest())));
+                       QString::fromStdString(ndn::toHex(*m_sock->getRootDigest(), false)));
 }
 
 void
-ChatDialogBackend::processChatData(const ndn::Data& data,
-                                   bool needDisplay,
-                                   bool isValidated)
+ChatDialogBackend::processChatData(const ndn::Data& data, bool needDisplay, bool isValidated)
 {
   ChatMessage msg;
 
@@ -344,7 +334,7 @@
   nodeInfos.push_back(nodeInfo);
 
   emit syncTreeUpdated(nodeInfos,
-                       QString::fromStdString(getHexEncodedDigest(m_sock->getRootDigest())));
+                       QString::fromStdString(ndn::toHex(*m_sock->getRootDigest(), false)));
 
   emit messageReceived(QString::fromStdString(sessionName.toUri()),
                        QString::fromStdString(msg.getNick()),
@@ -432,16 +422,6 @@
   emit chatPrefixChanged(m_routableUserChatPrefix);
 }
 
-std::string
-ChatDialogBackend::getHexEncodedDigest(ndn::ConstBufferPtr digest)
-{
-  std::stringstream os;
-
-  CryptoPP::StringSource(digest->data(), digest->size(), true,
-                         new CryptoPP::HexEncoder(new CryptoPP::FileSink(os), false));
-  return os.str();
-}
-
 
 // public slots:
 void
diff --git a/src/chat-dialog-backend.hpp b/src/chat-dialog-backend.hpp
index 0c417c3..e0c8b0c 100644
--- a/src/chat-dialog-backend.hpp
+++ b/src/chat-dialog-backend.hpp
@@ -105,9 +105,6 @@
   void
   updatePrefixes();
 
-  std::string
-  getHexEncodedDigest(ndn::ConstBufferPtr digest);
-
 signals:
   void
   syncTreeUpdated(std::vector<chronochat::NodeInfo> updates, QString digest);
diff --git a/src/chatroom-discovery-backend.cpp b/src/chatroom-discovery-backend.cpp
index 3f92e01..8e2ad21 100644
--- a/src/chatroom-discovery-backend.cpp
+++ b/src/chatroom-discovery-backend.cpp
@@ -9,19 +9,15 @@
  */
 
 #include "chatroom-discovery-backend.hpp"
+
 #include <QStringList>
 
-#ifndef Q_MOC_RUN
-
-#endif
-
 namespace chronochat {
 
 static const time::milliseconds FRESHNESS_PERIOD(60000);
 static const time::seconds REFRESH_INTERVAL(60);
 static const time::seconds HELLO_INTERVAL(60);
-static const ndn::Name::Component ROUTING_HINT_SEPARATOR =
-  ndn::name::Component::fromEscapedString("%F0%2E");
+static const Name::Component ROUTING_HINT_SEPARATOR = Name::Component::fromEscapedString("%F0%2E");
 // a count enforced when a manager himself find another one publish chatroom data
 static const int MAXIMUM_COUNT = 3;
 static const int IDENTITY_OFFSET = -1;
@@ -93,8 +89,6 @@
     close();
 
   } while (shouldResume);
-
-  std::cerr << "DiscoveryBackend: Bye!" << std::endl;
 }
 
 void
diff --git a/src/contact-manager.cpp b/src/contact-manager.cpp
index 5a5f5bb..5a6b4b9 100644
--- a/src/contact-manager.cpp
+++ b/src/contact-manager.cpp
@@ -10,20 +10,24 @@
  */
 
 #include "contact-manager.hpp"
+
 #include <QStringList>
 #include <QFile>
 
 #ifndef Q_MOC_RUN
 #include <ndn-cxx/encoding/buffer-stream.hpp>
 #include <ndn-cxx/face.hpp>
+#include <ndn-cxx/security/signing-helpers.hpp>
+#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/digest-filter.hpp>
+#include <ndn-cxx/security/transform/stream-sink.hpp>
 #include <ndn-cxx/security/validator.hpp>
 #include <ndn-cxx/security/validator-null.hpp>
-#include <ndn-cxx/security/signing-helpers.hpp>
 #include <ndn-cxx/security/verification-helpers.hpp>
-#include "cryptopp.hpp"
+
 #include <boost/asio.hpp>
-#include <boost/tokenizer.hpp>
 #include <boost/filesystem.hpp>
+#include <boost/tokenizer.hpp>
 #endif
 
 namespace fs = boost::filesystem;
@@ -82,10 +86,9 @@
 void
 ContactManager::fetchEndorseCertificateInternal(const Name& identity, size_t certIndex)
 {
-  shared_ptr<EndorseCollection> endorseCollection =
-    m_bufferedContacts[identity].m_endorseCollection;
+  auto endorseCollection = m_bufferedContacts[identity].m_endorseCollection;
 
-  if(certIndex >= endorseCollection->getCollectionEntries().size())
+  if (certIndex >= endorseCollection->getCollectionEntries().size())
     return prepareEndorseInfo(identity);
 
   Name interestName(endorseCollection->getCollectionEntries()[certIndex].certName);
@@ -114,15 +117,13 @@
   m_bufferedContacts[identity].m_endorseInfo = endorseInfo;
 
   map<string, size_t> endorseCount;
-  for (Profile::const_iterator pIt = profile.begin(); pIt != profile.end(); pIt++)
+  for (auto pIt = profile.begin(); pIt != profile.end(); pIt++)
     endorseCount[pIt->first] = 0;
 
   size_t endorseCertCount = 0;
 
-  vector<shared_ptr<EndorseCertificate> >::const_iterator cIt =
-    m_bufferedContacts[identity].m_endorseCertList.begin();
-  vector<shared_ptr<EndorseCertificate> >::const_iterator cEnd =
-    m_bufferedContacts[identity].m_endorseCertList.end();
+  auto cIt = m_bufferedContacts[identity].m_endorseCertList.cbegin();
+  auto cEnd = m_bufferedContacts[identity].m_endorseCertList.cend();
 
   for (; cIt != cEnd; cIt++, endorseCertCount++) {
     shared_ptr<Contact> contact = getContact((*cIt)->getSigner());
@@ -140,13 +141,13 @@
       continue;
 
     const Profile& tmpProfile = (*cIt)->getProfile();
-    const vector<string>& endorseList = (*cIt)->getEndorseList();
-    for (vector<string>::const_iterator eIt = endorseList.begin(); eIt != endorseList.end(); eIt++)
+    const auto& endorseList = (*cIt)->getEndorseList();
+    for (auto eIt = endorseList.begin(); eIt != endorseList.end(); eIt++)
       if (tmpProfile.get(*eIt) == profile.get(*eIt))
         endorseCount[*eIt] += 1;
   }
 
-  for (Profile::const_iterator pIt = profile.begin(); pIt != profile.end(); pIt++) {
+  for (auto pIt = profile.begin(); pIt != profile.end(); pIt++) {
     std::stringstream ss;
     ss << endorseCount[pIt->first] << "/" << endorseCertCount;
     endorseInfo->addEndorsement(pIt->first, pIt->second, ss.str());
@@ -232,23 +233,20 @@
 }
 
 void
-ContactManager::onEndorseCertificateInternal(const Interest& interest, const Data& data,
-                                             const Name& identity, size_t certIndex,
-                                             string hash)
+ContactManager::onEndorseCertificateInternal(const Interest&, const Data& data,
+                                             const Name& identity, size_t certIndex, string hash)
 {
-  std::stringstream ss;
+  std::ostringstream ss;
   {
-    using namespace CryptoPP;
-
-    SHA256 hash;
-    StringSource(data.wireEncode().wire(), data.wireEncode().size(), true,
-                 new HashFilter(hash, new FileSink(ss)));
+    using namespace ndn::security::transform;
+    bufferSource(data.wireEncode().wire(), data.wireEncode().size())
+        >> digestFilter(ndn::DigestAlgorithm::SHA256)
+        >> streamSink(ss);
   }
 
   if (ss.str() == hash) {
-    shared_ptr<EndorseCertificate> endorseCertificate =
-      make_shared<EndorseCertificate>(boost::cref(data));
-    m_bufferedContacts[identity].m_endorseCertList.push_back(endorseCertificate);
+    auto endorseCertificate = make_shared<EndorseCertificate>(data);
+    m_bufferedContacts[identity].m_endorseCertList.push_back(std::move(endorseCertificate));
   }
 
   fetchEndorseCertificateInternal(identity, certIndex+1);
@@ -269,7 +267,7 @@
     boost::recursive_mutex::scoped_lock lock(m_collectCountMutex);
     m_collectCount = m_contactList.size();
 
-    for (ContactList::iterator it  = m_contactList.begin(); it != m_contactList.end(); it++) {
+    for (auto it = m_contactList.begin(); it != m_contactList.end(); it++) {
       Name interestName = (*it)->getNameSpace();
       interestName.append("DNS").append(m_identity.wireEncode()).append("ENDORSEE");
 
@@ -384,8 +382,7 @@
     QStringList certNameList;
     QStringList nameList;
 
-    for(BufferedIdCerts::const_iterator it = m_bufferedIdCerts.begin();
-        it != m_bufferedIdCerts.end(); it++) {
+    for (auto it = m_bufferedIdCerts.begin(); it != m_bufferedIdCerts.end(); it++) {
       certNameList << QString::fromStdString(it->second->getName().toUri());
       Profile profile(*(it->second));
       nameList << QString::fromStdString(profile.get("name"));
@@ -402,7 +399,7 @@
   auto signCert = m_keyChain.getPib().getIdentity(m_identity)
                             .getDefaultKey().getDefaultCertificate();
   vector<string> endorseList;
-  for (Profile::const_iterator it = profile.begin(); it != profile.end(); it++)
+  for (auto it = profile.begin(); it != profile.end(); it++)
     endorseList.push_back(it->first);
 
   shared_ptr<EndorseCertificate> selfEndorseCertificate =
@@ -639,7 +636,7 @@
 {
   Name identityName(identity.toStdString());
 
-  BufferedContacts::const_iterator it = m_bufferedContacts.find(identityName);
+  auto it = m_bufferedContacts.find(identityName);
   if (it != m_bufferedContacts.end()) {
     Contact contact(*(it->second.m_selfEndorseCert));
 
@@ -750,8 +747,7 @@
   }
   m_bufferedIdCerts.clear();
 
-  for (vector<string>::const_iterator it = bufferedIdCertNames.begin();
-       it != bufferedIdCertNames.end(); it++) {
+  for (auto it = bufferedIdCertNames.begin(); it != bufferedIdCertNames.end(); it++) {
     Name certName(*it);
 
     Interest interest(certName);
@@ -785,7 +781,7 @@
   Name certName(qCertName.toStdString());
   Name identity = certName.getPrefix(-1);
 
-  BufferedIdCerts::const_iterator it = m_bufferedIdCerts.find(certName);
+  auto it = m_bufferedIdCerts.find(certName);
   if (it != m_bufferedIdCerts.end()) {
     Contact contact(*it->second);
     try {
@@ -811,7 +807,7 @@
 {
   QStringList aliasList;
   QStringList idList;
-  for (ContactList::const_iterator it = m_contactList.begin(); it != m_contactList.end(); it++) {
+  for (auto it = m_contactList.begin(); it != m_contactList.end(); it++) {
     aliasList << QString((*it)->getAlias().c_str());
     idList << QString((*it)->getNameSpace().toUri().c_str());
   }
@@ -823,7 +819,7 @@
 void
 ContactManager::onWaitForContactInfo(const QString& identity)
 {
-  for (ContactList::const_iterator it = m_contactList.begin(); it != m_contactList.end(); it++)
+  for (auto it = m_contactList.begin(); it != m_contactList.end(); it++)
     if ((*it)->getNameSpace().toUri() == identity.toStdString())
       emit contactInfoReady(QString((*it)->getNameSpace().toUri().c_str()),
                             QString((*it)->getName().c_str()),
diff --git a/src/contact-storage.cpp b/src/contact-storage.cpp
index 76ae31d..6703f41 100644
--- a/src/contact-storage.cpp
+++ b/src/contact-storage.cpp
@@ -10,7 +10,11 @@
  */
 
 #include "contact-storage.hpp"
-#include "cryptopp.hpp"
+
+#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/digest-filter.hpp>
+#include <ndn-cxx/security/transform/hex-encode.hpp>
+#include <ndn-cxx/security/transform/stream-sink.hpp>
 
 #include <boost/filesystem.hpp>
 
@@ -184,13 +188,13 @@
 {
   string dbName("chronos-");
 
-  std::stringstream ss;
+  std::ostringstream ss;
   {
-    using namespace CryptoPP;
-
-    SHA256 hash;
-    StringSource(m_identity.wireEncode().wire(), m_identity.wireEncode().size(), true,
-                 new HashFilter(hash, new HexEncoder(new FileSink(ss), false)));
+    using namespace ndn::security::transform;
+    bufferSource(m_identity.wireEncode().wire(), m_identity.wireEncode().size())
+        >> digestFilter(ndn::DigestAlgorithm::SHA256)
+        >> hexEncode(false)
+        >> streamSink(ss);
   }
   dbName.append(ss.str()).append(".db");
 
@@ -203,7 +207,7 @@
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db,
                      "SELECT name FROM sqlite_master WHERE type='table' And name=?",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, tableName, SQLITE_TRANSIENT);
   int res = sqlite3_step(stmt);
 
@@ -213,9 +217,9 @@
   sqlite3_finalize(stmt);
 
   if (!tableExist) {
-    char *errmsg = 0;
+    char *errmsg = nullptr;
     res = sqlite3_exec(m_db, sqlCreateStmt.c_str (), nullptr, nullptr, &errmsg);
-    if (res != SQLITE_OK && errmsg != 0)
+    if (res != SQLITE_OK && errmsg != nullptr)
       NDN_THROW(Error("Init \"error\" in " + tableName));
   }
 }
@@ -225,7 +229,8 @@
 {
   shared_ptr<Profile> profile = make_shared<Profile>(m_identity);
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "SELECT profile_type, profile_value FROM SelfProfile", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "SELECT profile_type, profile_value FROM SelfProfile",
+                     -1, &stmt, nullptr);
 
   while (sqlite3_step(stmt) == SQLITE_ROW) {
     string profileType = sqlite3_column_string(stmt, 0);
@@ -243,7 +248,7 @@
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db,
                      "INSERT OR REPLACE INTO SelfEndorse (identity, endorse_data) values (?, ?)",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, m_identity.toUri(), SQLITE_TRANSIENT);
   sqlite3_bind_block(stmt, 2, newEndorseCertificate.wireEncode(), SQLITE_TRANSIENT);
   sqlite3_step(stmt);
@@ -259,7 +264,7 @@
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db,
                      "SELECT endorse_data FROM SelfEndorse where identity=?",
-                      -1, &stmt, 0);
+                      -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, m_identity.toUri(), SQLITE_TRANSIENT);
 
   if (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -280,7 +285,7 @@
   sqlite3_prepare_v2(m_db,
                      "INSERT OR REPLACE INTO ProfileEndorse \
                       (identity, endorse_data) values (?, ?)",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity.toUri(), SQLITE_TRANSIENT);
   sqlite3_bind_block(stmt, 2, endorseCertificate.wireEncode(), SQLITE_TRANSIENT);
   sqlite3_step(stmt);
@@ -299,7 +304,7 @@
                      "INSERT OR REPLACE INTO CollectEndorse \
                       (endorser, endorse_name, endorse_data) \
                       VALUES (?, ?, ?)",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, endorserName.toUri(), SQLITE_TRANSIENT);
   sqlite3_bind_string(stmt, 2, certName.toUri(), SQLITE_TRANSIENT);
   sqlite3_bind_block(stmt, 3, endorseCertificate.wireEncode(), SQLITE_TRANSIENT);
@@ -312,17 +317,17 @@
 ContactStorage::getCollectEndorse(EndorseCollection& endorseCollection)
 {
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "SELECT endorse_name, endorse_data FROM CollectEndorse", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "SELECT endorse_name, endorse_data FROM CollectEndorse",
+                     -1, &stmt, nullptr);
 
   while (sqlite3_step(stmt) == SQLITE_ROW) {
     string certName = sqlite3_column_string(stmt, 0);
-    std::stringstream ss;
+    std::ostringstream ss;
     {
-      using namespace CryptoPP;
-      SHA256 hash;
-
-      StringSource(sqlite3_column_text(stmt, 1), sqlite3_column_bytes (stmt, 1), true,
-                   new HashFilter(hash, new FileSink(ss)));
+      using namespace ndn::security::transform;
+      bufferSource(sqlite3_column_text(stmt, 1), sqlite3_column_bytes(stmt, 1))
+          >> digestFilter(ndn::DigestAlgorithm::SHA256)
+          >> streamSink(ss);
     }
     endorseCollection.addCollectionEntry(Name(certName), ss.str());
   }
@@ -338,7 +343,7 @@
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db,
                      "SELECT endorse_name, endorse_data FROM CollectEndorse where endorse_name=?",
-                      -1, &stmt, 0);
+                      -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, name.toUri(), SQLITE_TRANSIENT);
 
   if (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -358,7 +363,7 @@
   sqlite3_prepare_v2(m_db,
                      "SELECT profile_type FROM ContactProfile \
                       WHERE profile_identity=? AND endorse=1 ORDER BY profile_type",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity.toUri(), SQLITE_TRANSIENT);
 
   while (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -375,17 +380,17 @@
   string identity = identityName.toUri();
 
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "DELETE FROM Contact WHERE contact_namespace=?", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "DELETE FROM Contact WHERE contact_namespace=?", -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
   sqlite3_step(stmt);
   sqlite3_finalize(stmt);
 
-  sqlite3_prepare_v2(m_db, "DELETE FROM ContactProfile WHERE profile_identity=?", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "DELETE FROM ContactProfile WHERE profile_identity=?", -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
   sqlite3_step(stmt);
   sqlite3_finalize(stmt);
 
-  sqlite3_prepare_v2(m_db, "DELETE FROM TrustScope WHERE contact_namespace=?", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "DELETE FROM TrustScope WHERE contact_namespace=?", -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
   sqlite3_step(stmt);
   sqlite3_finalize(stmt);
@@ -405,7 +410,7 @@
                      "INSERT INTO Contact (contact_namespace, contact_alias, contact_keyName, \
                       contact_key, notBefore, notAfter, is_introducer) \
                       values (?, ?, ?, ?, ?, ?, ?)",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
 
   sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
   sqlite3_bind_string(stmt, 2, contact.getAlias(), SQLITE_TRANSIENT);
@@ -422,12 +427,12 @@
   sqlite3_finalize(stmt);
 
   const Profile& profile = contact.getProfile();
-  for (Profile::const_iterator it = profile.begin(); it != profile.end(); it++) {
+  for (auto it = profile.begin(); it != profile.end(); it++) {
     sqlite3_prepare_v2(m_db,
                        "INSERT INTO ContactProfile \
                         (profile_identity, profile_type, profile_value, endorse) \
                         values (?, ?, ?, 0)",
-                       -1, &stmt, 0);
+                       -1, &stmt, nullptr);
     sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
     sqlite3_bind_string(stmt, 2, it->first, SQLITE_TRANSIENT);
     sqlite3_bind_string(stmt, 3, it->second, SQLITE_TRANSIENT);
@@ -436,13 +441,13 @@
   }
 
   if (isIntroducer) {
-    Contact::const_iterator it  = contact.trustScopeBegin();
-    Contact::const_iterator end = contact.trustScopeEnd();
+    auto it  = contact.trustScopeBegin();
+    auto end = contact.trustScopeEnd();
 
     while (it != end) {
       sqlite3_prepare_v2(m_db,
                          "INSERT INTO TrustScope (contact_namespace, trust_scope) values (?, ?)",
-                         -1, &stmt, 0);
+                         -1, &stmt, nullptr);
       sqlite3_bind_string(stmt, 1, identity, SQLITE_TRANSIENT);
       sqlite3_bind_string(stmt, 2, it->first.toUri(), SQLITE_TRANSIENT);
       sqlite3_step(stmt);
@@ -463,7 +468,7 @@
   sqlite3_prepare_v2(m_db,
                      "SELECT contact_alias, contact_keyName, contact_key, notBefore, notAfter, \
                       is_introducer FROM Contact where contact_namespace=?",
-                      -1, &stmt, 0);
+                      -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity.toUri(), SQLITE_TRANSIENT);
 
   if (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -487,7 +492,7 @@
   sqlite3_prepare_v2(m_db,
                      "SELECT profile_type, profile_value FROM ContactProfile \
                       where profile_identity=?",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, identity.toUri(), SQLITE_TRANSIENT);
 
   while (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -501,7 +506,7 @@
   if (contact->isIntroducer()) {
     sqlite3_prepare_v2(m_db,
                        "SELECT trust_scope FROM TrustScope WHERE contact_namespace=?",
-                       -1, &stmt, 0);
+                       -1, &stmt, nullptr);
     sqlite3_bind_string(stmt, 1, identity.toUri(), SQLITE_TRANSIENT);
 
     while (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -520,7 +525,7 @@
 {
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db, "UPDATE Contact SET is_introducer=? WHERE contact_namespace=?",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_int(stmt, 1, (isIntroducer ? 1 : 0));
   sqlite3_bind_string(stmt, 2, identity.toUri(), SQLITE_TRANSIENT);
   sqlite3_step(stmt);
@@ -533,7 +538,7 @@
 {
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db, "UPDATE Contact SET contact_alias=? WHERE contact_namespace=?",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, alias, SQLITE_TRANSIENT);
   sqlite3_bind_string(stmt, 2, identity.toUri(), SQLITE_TRANSIENT);
   sqlite3_step(stmt);
@@ -547,13 +552,14 @@
   bool result = false;
 
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "SELECT count(*) FROM Contact WHERE contact_namespace=?", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "SELECT count(*) FROM Contact WHERE contact_namespace=?",
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, name.toUri(), SQLITE_TRANSIENT);
 
   int res = sqlite3_step(stmt);
 
   if (res == SQLITE_ROW) {
-    int countAll = sqlite3_column_int (stmt, 0);
+    int countAll = sqlite3_column_int(stmt, 0);
     if (countAll > 0)
       result = true;
   }
@@ -568,7 +574,7 @@
   vector<Name> contactNames;
 
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "SELECT contact_namespace FROM Contact", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "SELECT contact_namespace FROM Contact", -1, &stmt, nullptr);
 
   while (sqlite3_step(stmt) == SQLITE_ROW) {
     string identity = sqlite3_column_string(stmt, 0);
@@ -576,7 +582,7 @@
   }
   sqlite3_finalize(stmt);
 
-  for (vector<Name>::iterator it = contactNames.begin(); it != contactNames.end(); it++) {
+  for (auto it = contactNames.begin(); it != contactNames.end(); it++) {
     shared_ptr<Contact> contact = getContact(*it);
     if (static_cast<bool>(contact))
       contacts.push_back(contact);
@@ -591,7 +597,7 @@
   sqlite3_prepare_v2(m_db,
                      "INSERT OR REPLACE INTO DnsData (dns_name, dns_type, dns_value, data_name) \
                       VALUES (?, ?, ?, ?)",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, name, SQLITE_TRANSIENT);
   sqlite3_bind_string(stmt, 2, type, SQLITE_TRANSIENT);
   sqlite3_bind_block(stmt, 3, data, SQLITE_TRANSIENT);
@@ -607,7 +613,7 @@
   shared_ptr<Data> data;
 
   sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(m_db, "SELECT dns_value FROM DnsData where data_name=?", -1, &stmt, 0);
+  sqlite3_prepare_v2(m_db, "SELECT dns_value FROM DnsData where data_name=?", -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, dataName.toUri(), SQLITE_TRANSIENT);
 
   if (sqlite3_step(stmt) == SQLITE_ROW) {
@@ -626,7 +632,7 @@
 
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(m_db, "SELECT dns_value FROM DnsData where dns_name=? and dns_type=?",
-                     -1, &stmt, 0);
+                     -1, &stmt, nullptr);
   sqlite3_bind_string(stmt, 1, name, SQLITE_TRANSIENT);
   sqlite3_bind_string(stmt, 2, type, SQLITE_TRANSIENT);
 
diff --git a/src/controller.cpp b/src/controller.cpp
index b8b2c97..9e794b9 100644
--- a/src/controller.cpp
+++ b/src/controller.cpp
@@ -10,7 +10,6 @@
  */
 
 #include "controller.hpp"
-#include "cryptopp.hpp"
 #include "conf.hpp"
 #include "endorse-info.hpp"
 
@@ -19,9 +18,14 @@
 #include <QDir>
 #include <QTimer>
 
-#include <boost/filesystem.hpp>
+#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/digest-filter.hpp>
+#include <ndn-cxx/security/transform/hex-encode.hpp>
+#include <ndn-cxx/security/transform/stream-sink.hpp>
 #include <ndn-cxx/util/random.hpp>
 
+#include <boost/filesystem.hpp>
+
 Q_DECLARE_METATYPE(ndn::Name)
 Q_DECLARE_METATYPE(ndn::security::Certificate)
 Q_DECLARE_METATYPE(chronochat::EndorseInfo)
@@ -247,7 +251,19 @@
   saveConf();
 }
 
-// public methods
+static string
+getRandomString()
+{
+  uint32_t r = ndn::random::generateWord32();
+  std::ostringstream ss;
+  {
+    using namespace ndn::security::transform;
+    bufferSource(reinterpret_cast<const uint8_t*>(&r), sizeof(r))
+        >> hexEncode(false)
+        >> streamSink(ss);
+  }
+  return ss.str();
+}
 
 
 // private methods
@@ -256,13 +272,13 @@
 {
   string dbName("chronos-");
 
-  std::stringstream ss;
+  std::ostringstream ss;
   {
-    using namespace CryptoPP;
-
-    SHA256 hash;
-    StringSource(m_identity.wireEncode().wire(), m_identity.wireEncode().size(), true,
-                 new HashFilter(hash, new HexEncoder(new FileSink(ss), false)));
+    using namespace ndn::security::transform;
+    bufferSource(m_identity.wireEncode().wire(), m_identity.wireEncode().size())
+        >> digestFilter(ndn::DigestAlgorithm::SHA256)
+        >> hexEncode(false)
+        >> streamSink(ss);
   }
   dbName.append(ss.str()).append(".db");
 
@@ -429,8 +445,8 @@
   menu->addAction(m_addContactAction);
   menu->addSeparator();
   {
-    ChatActionList::const_iterator it = m_chatActionList.begin();
-    ChatActionList::const_iterator end = m_chatActionList.end();
+    auto it = m_chatActionList.begin();
+    auto end = m_chatActionList.end();
     if (it != end) {
       for (; it != end; it++)
         menu->addAction(it->second);
@@ -442,8 +458,8 @@
   menu->addAction(m_minimizeAction);
   m_closeMenu = menu->addMenu("Close chatroom");
   {
-    ChatActionList::const_iterator it = m_closeActionList.begin();
-    ChatActionList::const_iterator end = m_closeActionList.end();
+    auto it = m_closeActionList.begin();
+    auto end = m_closeActionList.end();
     if (it == end)
       m_closeMenu->setEnabled(false);
     else
@@ -454,30 +470,6 @@
   menu->addAction(m_quitAction);
 }
 
-string
-Controller::getRandomString()
-{
-  uint32_t r = ndn::random::generateWord32();
-  std::stringstream ss;
-  {
-    using namespace CryptoPP;
-    StringSource(reinterpret_cast<uint8_t*>(&r), 4, true,
-                 new HexEncoder(new FileSink(ss), false));
-
-  }
-  // for (int i = 0; i < 8; i++)
-  //   {
-  //     uint32_t t = r & mask;
-  //     if (t < 10)
-  //       ss << static_cast<char>(t + 0x30);
-  //     else
-  //       ss << static_cast<char>(t + 0x57);
-  //     r = r >> 4;
-  //   }
-
-  return ss.str();
-}
-
 void
 Controller::addChatDialog(const QString& chatroomName, ChatDialog* chatDialog)
 {
@@ -529,7 +521,7 @@
 Controller::onIdentityUpdated(const QString& identity)
 {
   while (!m_chatDialogList.empty()) {
-    ChatDialogList::const_iterator it = m_chatDialogList.begin();
+    auto it = m_chatDialogList.begin();
     it->second->shutdown();
   }
 
@@ -646,8 +638,8 @@
   m_addContactPanel->hide();
   m_discoveryPanel->hide();
 
-  ChatDialogList::iterator it = m_chatDialogList.begin();
-  ChatDialogList::iterator end = m_chatDialogList.end();
+  auto it = m_chatDialogList.begin();
+  auto end = m_chatDialogList.end();
   for (; it != end; it++)
     it->second->hide();
 }
@@ -656,7 +648,7 @@
 Controller::onQuitAction()
 {
   while (!m_chatDialogList.empty()) {
-    ChatDialogList::const_iterator it = m_chatDialogList.begin();
+    auto it = m_chatDialogList.begin();
     it->second->shutdown();
   }
 
@@ -732,8 +724,7 @@
   QString chatroomName = QString::fromStdString(invitation.getChatroom());
   onStartChatroom(chatroomName, secured);
 
-  ChatDialogList::iterator it = m_chatDialogList.find(chatroomName.toStdString());
-
+  auto it = m_chatDialogList.find(chatroomName.toStdString());
   BOOST_ASSERT(it != m_chatDialogList.end());
   it->second->addSyncAnchor(invitation);
 }
@@ -759,7 +750,7 @@
 {
   emit removeChatroom(chatroomName);
 
-  ChatDialogList::iterator it = m_chatDialogList.find(chatroomName.toStdString());
+  auto it = m_chatDialogList.find(chatroomName.toStdString());
   if (it != m_chatDialogList.end()) {
     ChatDialog* deletedChat = it->second;
     if (deletedChat)
diff --git a/src/controller.hpp b/src/controller.hpp
index ca92c82..d0635bb 100644
--- a/src/controller.hpp
+++ b/src/controller.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2013, Regents of the University of California
+ * Copyright (c) 2020, Regents of the University of California
  *                     Yingdi Yu
  *
  * BSD license, See the LICENSE file for more information
@@ -73,9 +73,6 @@
   void
   updateMenu();
 
-  std::string
-  getRandomString();
-
   void
   addChatDialog(const QString& chatroomName, ChatDialog* chatDialog);
 
diff --git a/src/cryptopp.hpp b/src/cryptopp.hpp
deleted file mode 100644
index 01fbfc2..0000000
--- a/src/cryptopp.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef CHRONOCHAT_CRYPTOPP_HPP
-#define CHRONOCHAT_CRYPTOPP_HPP
-
-// suppress CryptoPP warnings
-#pragma GCC system_header
-#pragma clang system_header
-
-#include <cryptopp/hex.h>
-#include <cryptopp/files.h>
-#include <cryptopp/base64.h>
-#include <cryptopp/sha.h>
-#include <cryptopp/filters.h>
-
-#endif // CHRONOCHAT_CRYPTOPP_HPP
diff --git a/src/invitation.cpp b/src/invitation.cpp
index 9af3c4d..8ca4b06 100644
--- a/src/invitation.cpp
+++ b/src/invitation.cpp
@@ -10,12 +10,9 @@
 
 #include "invitation.hpp"
 
-#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
-
 namespace chronochat {
 
 using std::string;
-
 using ndn::security::Certificate;
 
 const size_t  Invitation::NAME_SIZE_MIN         = 7;
diff --git a/src/main.cpp b/src/main.cpp
index 039fa42..a9b4c38 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -11,40 +11,33 @@
 #include "controller.hpp"
 
 #include <QApplication>
-#include <QTextCodec>
 
+#include <boost/exception/diagnostic_information.hpp>
 #include <iostream>
-#include <ndn-cxx/face.hpp>
-#include <boost/thread/thread.hpp>
 
-class NewApp : public QApplication
+class ChronoChatApp : public QApplication
 {
 public:
-  NewApp(int& argc, char** argv)
-    : QApplication(argc, argv)
-  {
-  }
+  using QApplication::QApplication;
 
   bool
-  notify(QObject* receiver, QEvent* event)
+  notify(QObject* receiver, QEvent* event) final
   {
     try {
       return QApplication::notify(receiver, event);
     }
     catch (const std::exception& e) {
-      std::cerr << "Exception thrown:" << e.what() << std::endl;
+      std::cerr << boost::diagnostic_information(e) << std::endl;
       return false;
     }
-
   }
 };
 
-int main(int argc, char *argv[])
+int
+main(int argc, char *argv[])
 {
-  NewApp app(argc, argv);
-
+  ChronoChatApp app(argc, argv);
   chronochat::Controller controller;
-
   app.setQuitOnLastWindowClosed(false);
 
   return app.exec();
diff --git a/test/contact-storage.t.cpp b/test/contact-storage.t.cpp
index a9265e6..c554a58 100644
--- a/test/contact-storage.t.cpp
+++ b/test/contact-storage.t.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "contact-storage.hpp"
-#include "cryptopp.hpp"
 
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
@@ -14,12 +13,11 @@
 namespace chronochat {
 namespace tests {
 
-using std::string;
 namespace fs = boost::filesystem;
 
 BOOST_AUTO_TEST_SUITE(TestContactStorage)
 
-const string dbName("chronos-20e9530008b27c661ad3429d1956fa1c509b652dce9273bfe81b7c91819c272c.db");
+const std::string dbName("chronos-20e9530008b27c661ad3429d1956fa1c509b652dce9273bfe81b7c91819c272c.db");
 
 BOOST_AUTO_TEST_CASE(InitializeTable)
 {
diff --git a/test/endorse-certificate.t.cpp b/test/endorse-certificate.t.cpp
index 6fef721..416972f 100644
--- a/test/endorse-certificate.t.cpp
+++ b/test/endorse-certificate.t.cpp
@@ -6,13 +6,15 @@
  */
 
 #include "endorse-certificate.hpp"
-#include "cryptopp.hpp"
 
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
 
-#include <ndn-cxx/security/key-chain.hpp>
 #include <ndn-cxx/encoding/buffer-stream.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
+#include <ndn-cxx/security/transform/base64-decode.hpp>
+#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/stream-sink.hpp>
 #include <ndn-cxx/util/time.hpp>
 #include <ndn-cxx/util/io.hpp>
 
@@ -27,8 +29,9 @@
 
 BOOST_AUTO_TEST_SUITE(TestEndorseCertificate)
 
-std::string
-getTestFile(std::string path) {
+static std::string
+getTestFile(std::string path)
+{
   std::ifstream t(path);
   std::stringstream buffer;
   buffer << t.rdbuf();
@@ -83,8 +86,8 @@
   const std::string testIdKey = getTestFile("test/cert/testid.key");
   ndn::OBufferStream keyOs;
   {
-    using namespace CryptoPP;
-    StringSource(testIdKey, true, new Base64Decoder(new FileSink(keyOs)));
+    using namespace ndn::security::transform;
+    bufferSource(testIdKey) >> base64Decode() >> streamSink(keyOs);
   }
   BOOST_CHECK(idCert->getPublicKey() == *keyOs.buf());
 }
diff --git a/wscript b/wscript
index ca889e9..a2f88e4 100644
--- a/wscript
+++ b/wscript
@@ -1,39 +1,39 @@
 # -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-VERSION='0.5'
-APPNAME='ChronoChat'
 
-from waflib import Configure, Utils, Logs, Context
+from waflib import Context, Logs, Utils
 import os
 
+VERSION = '0.5'
+APPNAME = 'ChronoChat'
+
 def options(opt):
+    opt.load(['compiler_cxx', 'gnu_dirs'])
+    opt.load(['default-compiler-flags',
+              'boost', 'qt5_custom',
+              'doxygen', 'sphinx_build'],
+             tooldir=['.waf-tools'])
 
-    opt.load(['compiler_c', 'compiler_cxx', 'gnu_dirs'])
-
-    opt.load(['default-compiler-flags', 'boost',
-              'doxygen', 'sphinx_build', 'qt5_custom', 'cryptopp'],
-              tooldir=['.waf-tools'])
-
-    opt = opt.add_option_group('ChronoChat Options')
-
-    opt.add_option('--with-tests', action='store_true', default=False, dest='with_tests',
-                   help='''build unit tests''')
+    optgrp = opt.add_option_group('ChronoChat Options')
+    optgrp.add_option('--with-tests', action='store_true', default=False,
+                      help='Build unit tests')
 
 def configure(conf):
-    conf.load(['compiler_c', 'compiler_cxx', 'qt5_custom',
-               'default-compiler-flags', 'boost', 'gnu_dirs',
-               'doxygen', 'sphinx_build', 'cryptopp'])
+    conf.load(['compiler_cxx', 'gnu_dirs',
+               'default-compiler-flags', 'boost', 'qt5_custom',
+               'doxygen', 'sphinx_build'])
 
-    conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
-                   uselib_store='NDN_CXX', mandatory=True)
+    conf.env.WITH_TESTS = conf.options.with_tests
 
-    conf.check_cfg (package='ChronoSync', args=['ChronoSync >= 0.5', '--cflags', '--libs'],
-                    uselib_store='SYNC', mandatory=True)
+    pkg_config_path = os.environ.get('PKG_CONFIG_PATH', '%s/pkgconfig' % conf.env.LIBDIR)
+    conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'], uselib_store='NDN_CXX',
+                   pkg_config_path=pkg_config_path)
+    conf.check_cfg(package='ChronoSync', args=['--cflags', '--libs'], uselib_store='SYNC',
+                   pkg_config_path=pkg_config_path)
 
-    boost_libs = 'system random thread filesystem'
-    if conf.options.with_tests:
-        conf.env['WITH_TESTS'] = 1
-        conf.define('WITH_TESTS', 1);
-        boost_libs += ' unit_test_framework'
+    boost_libs = ['system', 'random', 'thread', 'filesystem']
+    if conf.env.WITH_TESTS:
+        boost_libs.append('unit_test_framework')
+        conf.define('WITH_TESTS', 1)
 
     conf.check_boost(lib=boost_libs, mt=True)
     if conf.env.BOOST_VERSION_NUMBER < 105800:
@@ -45,29 +45,28 @@
                   'If you encounter any problems, please upgrade your distribution or manually install a newer version of Boost.\n'
                   'For more information, see https://redmine.named-data.net/projects/nfd/wiki/Boost')
 
-    conf.check_cryptopp()
     conf.check_compiler_flags()
     conf.write_config_header('src/config.h')
 
 def build (bld):
     feature_list = 'qt5 cxx'
-    if bld.env["WITH_TESTS"]:
+    if bld.env.WITH_TESTS:
         feature_list += ' cxxstlib'
     else:
         feature_list += ' cxxprogram'
 
-    qt = bld (
+    qt = bld(
         target = "ChronoChat",
         features = feature_list,
         defines = "WAF=1",
         source = bld.path.ant_glob(['src/*.cpp', 'src/*.ui', '*.qrc']),
         includes = "src .",
-        use = "QT5CORE QT5GUI QT5WIDGETS QT5SQL NDN_CXX BOOST SYNC CRYPTOPP",
+        use = "QT5CORE QT5GUI QT5WIDGETS QT5SQL NDN_CXX BOOST SYNC",
         )
 
     # Unit tests
-    if bld.env["WITH_TESTS"]:
-      unittests = bld.program (
+    if bld.env.WITH_TESTS:
+      unittests = bld.program(
           target="unit-tests",
           source = bld.path.ant_glob(['test/**/*.cpp']),
           features=['cxx', 'cxxprogram'],
@@ -87,7 +86,7 @@
                 install_path = None,
             )
 
-    if not bld.env["WITH_TESTS"]:
+    if not bld.env.WITH_TESTS:
         if Utils.unversioned_sys_platform () == "darwin":
             app_plist = '''<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
@@ -130,8 +129,6 @@
             bld.install_files("${DATAROOTDIR}/chronochat",
                               bld.path.ant_glob(['linux/Resources/*']))
 
-
-# docs
 def docs(bld):
     from waflib import Options
     Options.commands = ['doxygen', 'sphinx'] + Options.commands
