diff --git a/src/leaf-container.hpp b/src/leaf-container.hpp
index 4e7a805..0a01bd7 100644
--- a/src/leaf-container.hpp
+++ b/src/leaf-container.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2021 University of California, Los Angeles
+ * Copyright (c) 2012-2022 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -42,14 +42,12 @@
 
 struct SessionNameHash
 {
+  static_assert(ndn::util::Sha256::DIGEST_SIZE >= sizeof(std::size_t), "");
+
   std::size_t
   operator()(const Name& prefix) const
   {
-    ConstBufferPtr buffer =
-      ndn::util::Sha256::computeDigest(prefix.wireEncode().wire(), prefix.wireEncode().size());
-
-    BOOST_ASSERT(buffer->size() > sizeof(std::size_t));
-
+    auto buffer = ndn::util::Sha256::computeDigest(prefix.wireEncode());
     return *reinterpret_cast<const std::size_t*>(buffer->data());
   }
 };
diff --git a/src/logic.cpp b/src/logic.cpp
index 9d09bbc..05defbd 100644
--- a/src/logic.cpp
+++ b/src/logic.cpp
@@ -273,10 +273,7 @@
     if (!m_isInReset) {
       CHRONO_LOG_DBG("updateSeqNo: not in Reset");
       ConstBufferPtr previousRoot = m_state.getRootDigest();
-      {
-        std::string hash = ndn::toHex(previousRoot->data(), previousRoot->size(), false);
-        CHRONO_LOG_DBG("Hash: " << hash);
-      }
+      printDigest(previousRoot);
 
       bool isInserted = false;
       bool isUpdated = false;
@@ -398,7 +395,7 @@
 void
 Logic::onSyncDataValidated(const Data& data)
 {
-  Name name = data.getName();
+  const auto& name = data.getName();
   ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
 
   try {
@@ -407,7 +404,7 @@
     processSyncData(name, digest, Block(std::move(contentBuffer)));
   }
   catch (const std::ios_base::failure& error) {
-    NDN_LOG_WARN("Error decompressing content of " << data.getName() << " (" << error.what() << ")");
+    NDN_LOG_WARN("Error decompressing content of " << name << " (" << error.what() << ")");
   }
 }
 
@@ -416,9 +413,8 @@
 {
   CHRONO_LOG_DBG(">> Logic::processSyncInterest");
 
-  Name name = interest.getName();
+  const auto& name = interest.getName();
   ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
-
   ConstBufferPtr rootDigest = m_state.getRootDigest();
 
   // If the digest of the incoming interest is the same as root digest
@@ -669,7 +665,7 @@
   syncReply.setFreshnessPeriod(m_syncReplyFreshness);
 
   auto finalizeReply = [this, &nodePrefix, &syncReply] (const State& state) {
-    auto contentBuffer = bzip2::compress(reinterpret_cast<const char*>(state.wireEncode().wire()),
+    auto contentBuffer = bzip2::compress(reinterpret_cast<const char*>(state.wireEncode().data()),
                                          state.wireEncode().size());
     syncReply.setContent(contentBuffer);
 
@@ -737,10 +733,9 @@
 }
 
 void
-Logic::printDigest(ConstBufferPtr digest)
+Logic::printDigest(const ConstBufferPtr& digest) const
 {
-  std::string hash = ndn::toHex(digest->data(), digest->size(), false);
-  CHRONO_LOG_DBG("Hash: " << hash);
+  CHRONO_LOG_DBG("Hash: " << ndn::toHex(*digest, false));
 }
 
 void
@@ -771,7 +766,7 @@
 {
   CHRONO_LOG_DBG(">> Logic::processRecoveryInterest");
 
-  Name name = interest.getName();
+  const auto& name = interest.getName();
   ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
   ConstBufferPtr rootDigest = m_state.getRootDigest();
 
diff --git a/src/logic.hpp b/src/logic.hpp
index 25514ed..1383ef2 100644
--- a/src/logic.hpp
+++ b/src/logic.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2021 University of California, Los Angeles
+ * Copyright (c) 2012-2022 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -399,7 +399,7 @@
   cancelReset();
 
   void
-  printDigest(ConstBufferPtr digest);
+  printDigest(const ConstBufferPtr& digest) const;
 
   /**
    * @brief Helper method to send Recovery Interest
diff --git a/src/socket.cpp b/src/socket.cpp
index 346e968..e2c8b66 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -55,8 +55,8 @@
   if (m_userPrefix != DEFAULT_NAME)
     m_registeredPrefixList[m_userPrefix] =
       m_face.setInterestFilter(m_userPrefix,
-                               bind(&Socket::onInterest, this, _1, _2),
-                               [] (const Name&, const std::string&) {});
+                               [this] (auto&&... args) { onInterest(std::forward<decltype(args)>(args)...); },
+                               [] (auto&&...) {});
   NDN_LOG_DEBUG("<< Socket::Socket");
 }
 
@@ -84,8 +84,8 @@
   m_logic.addUserNode(prefix, signingId, session);
   m_registeredPrefixList[prefix] =
     m_face.setInterestFilter(prefix,
-                             bind(&Socket::onInterest, this, _1, _2),
-                             [] (const Name&, const std::string&) {});
+                             [this] (auto&&... args) { onInterest(std::forward<decltype(args)>(args)...); },
+                             [] (auto&&...) {});
 
   NDN_LOG_DEBUG("<< addSyncNode");
 }
@@ -110,14 +110,14 @@
 Socket::publishData(const uint8_t* buf, size_t len, const ndn::time::milliseconds& freshness,
                     const Name& prefix)
 {
-  publishData(ndn::encoding::makeBinaryBlock(ndn::tlv::Content, buf, len), freshness, prefix);
+  publishData(ndn::makeBinaryBlock(ndn::tlv::Content, {buf, len}), freshness, prefix);
 }
 
 void
 Socket::publishData(const uint8_t* buf, size_t len, const ndn::time::milliseconds& freshness,
                     const uint64_t& seqNo, const Name& prefix)
 {
-  publishData(ndn::encoding::makeBinaryBlock(ndn::tlv::Content, buf, len), freshness, seqNo, prefix);
+  publishData(ndn::makeBinaryBlock(ndn::tlv::Content, {buf, len}), freshness, seqNo, prefix);
 }
 
 void
@@ -178,7 +178,7 @@
   interest.setMustBeFresh(true);
 
   DataValidationErrorCallback failureCallback =
-    bind(&Socket::onDataValidationFailed, this, _1, _2);
+    [this] (auto&&... args) { onDataValidationFailed(std::forward<decltype(args)>(args)...); };
 
   m_face.expressInterest(interest,
                          bind(&Socket::onData, this, _1, _2, dataCallback, failureCallback),
@@ -254,8 +254,7 @@
 }
 
 void
-Socket::onDataValidationFailed(const Data& data,
-                               const ValidationError& error)
+Socket::onDataValidationFailed(const Data&, const ValidationError&)
 {
 }
 
diff --git a/src/state.cpp b/src/state.cpp
index ab9d87d..00df7b9 100644
--- a/src/state.cpp
+++ b/src/state.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
 /*
- * Copyright (c) 2012-2021 University of California, Los Angeles
+ * Copyright (c) 2012-2022 University of California, Los Angeles
  *
  * This file is part of ChronoSync, synchronization library for distributed realtime
  * applications for NDN.
@@ -48,7 +48,7 @@
     }
 
     SeqNo old = (*leaf)->getSeq();
-    m_leaves.modify(leaf, [=] (LeafPtr& leaf) { leaf->setSeq(seq); } );
+    m_leaves.modify(leaf, [seq] (LeafPtr& leaf) { leaf->setSeq(seq); } );
     return std::make_tuple(false, true, old);
   }
 }
@@ -60,7 +60,7 @@
 
   for (const auto& leaf : m_leaves.get<ordered>()) {
     BOOST_ASSERT(leaf != nullptr);
-    m_digest.update(leaf->getDigest()->data(), leaf->getDigest()->size());
+    m_digest.update(*leaf->getDigest());
   }
 
   return m_digest.computeDigest();
