diff --git a/cmd/dump-db.cpp b/cmd/dump-db.cpp
index 3333507..cb78224 100644
--- a/cmd/dump-db.cpp
+++ b/cmd/dump-db.cpp
@@ -18,24 +18,31 @@
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
 
-#include "ccnx-wrapper.hpp"
 #include "dispatcher.hpp"
-#include "fs-watcher.hpp"
-#include "logging.hpp"
+#include "sync-core.hpp"
+
+#include "core/logging.hpp"
+
+#include <ndn-cxx/util/string-helper.hpp>
 
 #include <boost/lexical_cast.hpp>
-#include <boost/make_shared.hpp>
 
-using namespace boost;
-using namespace std;
-using namespace Ndnx;
+namespace ndn {
+namespace chronoshare {
 
 _LOG_INIT(DumpDb);
 
+using std::cout;
+using std::cerr;
+using std::endl;
+using std::setw;
+
+namespace fs = boost::filesystem;
+
 class StateLogDumper : public DbHelper
 {
 public:
-  StateLogDumper(const filesystem::path& path)
+  StateLogDumper(const fs::path& path)
     : DbHelper(path / ".chronoshare", "sync-log.db")
   {
   }
@@ -45,10 +52,10 @@
   {
     sqlite3_stmt* stmt;
     sqlite3_prepare_v2(m_db,
-                       "SELECT hash(device_name, seq_no) FROM (SELECT * FROM SyncNodes ORDER BY device_name)",
+                       "SELECT hash(device_name, seq_no) FROM(SELECT * FROM SyncNodes ORDER BY device_name)",
                        -1, &stmt, 0);
     sqlite3_step(stmt);
-    Hash hash(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
+    ndn::Buffer hash(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
     sqlite3_finalize(stmt);
 
     sqlite3_prepare_v2(m_db, "SELECT device_name, seq_no, last_known_locator, last_update "
@@ -57,7 +64,7 @@
                        -1, &stmt, 0);
 
     cout.setf(std::ios::left, std::ios::adjustfield);
-    cout << ">> SYNC NODES (" << hash.shortHash() << ") <<" << endl;
+    cout << ">> SYNC NODES(" << toHex(hash).substr(0, 8) << ") <<" << endl;
     cout << "===================================================================================="
          << endl;
     cout << setw(30) << "device_name"
@@ -68,12 +75,18 @@
 
     while (sqlite3_step(stmt) == SQLITE_ROW) {
       cout << setw(30)
-           << lexical_cast<string>(Name(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0)))
+           << (Name(Block(sqlite3_column_blob(stmt, 0), (sqlite3_column_bytes(stmt, 0))))).toUri()
            << " | ";                                             // device_name
       cout << setw(6) << sqlite3_column_int64(stmt, 1) << " | "; // seq_no
-      cout << setw(20)
-           << lexical_cast<string>(Name(sqlite3_column_blob(stmt, 2), sqlite3_column_bytes(stmt, 2)))
-           << " | "; // locator
+      cout << setw(20);
+      if (sqlite3_column_bytes(stmt, 2) > 0) {
+        cout << (Name(Block(sqlite3_column_blob(stmt, 2), (sqlite3_column_bytes(stmt, 2))))).toUri();
+      }
+      else {
+        cout << "NULL";
+      }
+      cout << " | "; // locator
+
       if (sqlite3_column_bytes(stmt, 3) > 0) {
         cout << setw(10) << sqlite3_column_text(stmt, 3) << endl;
       }
@@ -88,7 +101,7 @@
   DumpLog()
   {
     sqlite3_stmt* stmt;
-    sqlite3_prepare_v2(m_db, "SELECT state_hash, last_update, state_id "
+    sqlite3_prepare_v2(m_db, "SELECT state_hash, last_update, state_id, last_update "
                              "   FROM SyncLog "
                              "   ORDER BY last_update",
                        -1, &stmt, 0);
@@ -104,7 +117,9 @@
 
     while (sqlite3_step(stmt) == SQLITE_ROW) {
       cout << setw(10)
-           << Hash(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0)).shortHash()
+           << toHex(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, 0)),
+                    sqlite3_column_bytes(stmt, 0))
+                .substr(0, 8)
            << " | "; // state hash
 
       sqlite3_stmt* stmt2;
@@ -118,8 +133,7 @@
       sqlite3_bind_int64(stmt2, 1, sqlite3_column_int64(stmt, 2));
 
       while (sqlite3_step(stmt2) == SQLITE_ROW) {
-        cout << lexical_cast<string>(
-                  Name(sqlite3_column_blob(stmt2, 0), sqlite3_column_bytes(stmt2, 0)))
+        cout << (Name(Block(sqlite3_column_blob(stmt2, 0), (sqlite3_column_bytes(stmt2, 0))))).toUri()
              << "(" << sqlite3_column_int64(stmt2, 1) << "); ";
       }
 
@@ -134,7 +148,7 @@
 class ActionLogDumper : public DbHelper
 {
 public:
-  ActionLogDumper(const filesystem::path& path)
+  ActionLogDumper(const fs::path& path)
     : DbHelper(path / ".chronoshare", "action-log.db")
   {
   }
@@ -162,7 +176,7 @@
 
     while (sqlite3_step(stmt) == SQLITE_ROW) {
       cout << setw(30)
-           << lexical_cast<string>(Name(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0)))
+           << (Name(Block(sqlite3_column_blob(stmt, 0), (sqlite3_column_bytes(stmt, 0))))).toUri()
            << " | ";                                             // device_name
       cout << setw(6) << sqlite3_column_int64(stmt, 1) << " | "; // seq_no
       cout << setw(6) << (sqlite3_column_int(stmt, 2) == 0 ? "UPDATE" : "DELETE") << " | "; // action
@@ -171,7 +185,9 @@
 
       if (sqlite3_column_int(stmt, 2) == 0) {
         cout << setw(10)
-             << Hash(sqlite3_column_blob(stmt, 5), sqlite3_column_bytes(stmt, 5)).shortHash()
+             << toHex(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, 5)),
+                      sqlite3_column_bytes(stmt, 5))
+                  .substr(0, 8)
              << " | ";
         cout << setw(7) << sqlite3_column_int64(stmt, 6) << " | "; // seg_num
       }
@@ -179,8 +195,8 @@
         cout << "           |         | ";
 
       if (sqlite3_column_bytes(stmt, 7) > 0) {
-        cout << setw(30) << lexical_cast<string>(
-                              Name(sqlite3_column_blob(stmt, 7), sqlite3_column_bytes(stmt, 7)))
+        cout << setw(30)
+             << (Name(Block(sqlite3_column_blob(stmt, 7), (sqlite3_column_bytes(stmt, 7))))).toUri()
              << " | ";                                    // parent_device_name
         cout << setw(5) << sqlite3_column_int64(stmt, 8); // seq_no
       }
@@ -194,45 +210,50 @@
   }
 
   void
-  DumpActionData(const Ccnx::Name& deviceName, int64_t seqno)
+  DumpActionData(const ndn::Name& deviceName, int64_t seqno)
   {
     sqlite3_stmt* stmt;
     sqlite3_prepare_v2(m_db,
                        "SELECT action_content_object, action_name FROM ActionLog WHERE device_name = ? and seq_no = ?",
                        -1, &stmt, 0);
-    Ccnx::CcnxCharbufPtr device_name = deviceName.toCcnxCharbuf();
-    sqlite3_bind_blob(stmt, 1, device_name->buf(), device_name->length(), SQLITE_STATIC);
+    const ndn::Block nameBlock = deviceName.wireEncode();
+    sqlite3_bind_blob(stmt, 1, nameBlock.wire(), nameBlock.size(), SQLITE_STATIC);
     sqlite3_bind_int64(stmt, 2, seqno);
     cout << "Dumping action data for: [" << deviceName << ", " << seqno << "]" << endl;
     if (sqlite3_step(stmt) == SQLITE_ROW) {
-      PcoPtr pco = make_shared<ParsedContentObject>(reinterpret_cast<const unsigned char*>(
-                                                      sqlite3_column_blob(stmt, 0)),
-                                                    sqlite3_column_bytes(stmt, 0));
-      Ccnx::Name actionName = Ccnx::Name(sqlite3_column_blob(stmt, 1), sqlite3_column_bytes(stmt, 0));
-      if (pco) {
-        ActionItemPtr action = deserializeMsg<ActionItem>(pco->content());
+      ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>(
+        ndn::Block(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, 0)),
+                   sqlite3_column_bytes(stmt, 0)));
+      ndn::Name actionName =
+        Name(Block(sqlite3_column_blob(stmt, 1), (sqlite3_column_bytes(stmt, 1))));
+      if (data) {
+        ActionItemPtr action = deserializeMsg<ActionItem>(
+          ndn::Buffer(data->getContent().value(), data->getContent().value_size()));
         if (action) {
-          cout << "Action data size : " << pco->content().size() << endl;
+          cout << "Action data size : " << data->getContent().size() << endl;
           cout << "Action data name : " << actionName << endl;
-          string type = action->action() == ActionItem::UPDATE ? "UPDATE" : "DELETE";
+          std::string type = action->action() == ActionItem::UPDATE ? "UPDATE" : "DELETE";
           cout << "Action Type = " << type << endl;
           cout << "Timestamp = " << action->timestamp() << endl;
-          string filename = action->filename();
+          std::string filename = action->filename();
           cout << "Filename = " << filename << endl;
           if (action->has_seg_num()) {
             cout << "Segment number = " << action->seg_num() << endl;
           }
           if (action->has_file_hash()) {
-            cout << "File hash = " << Hash(action->file_hash().c_str(), action->file_hash().size())
+            cout << "File hash = "
+                 << toHex(reinterpret_cast<const uint8_t*>(action->file_hash().data()),
+                          action->file_hash().size())
+                      .substr(0, 8)
                  << endl;
           }
         }
         else {
-          cerr << "Error! Failed to parse action from pco! " << endl;
+          cerr << "Error! Failed to parse action from data! " << endl;
         }
       }
       else {
-        cerr << "Error! Invalid pco! " << endl;
+        cerr << "Error! Invalid data! " << endl;
       }
     }
     else {
@@ -245,7 +266,7 @@
 class FileStateDumper : public DbHelper
 {
 public:
-  FileStateDumper(const filesystem::path& path)
+  FileStateDumper(const fs::path& path)
     : DbHelper(path / ".chronoshare", "file-state.db")
   {
   }
@@ -272,11 +293,14 @@
     while (sqlite3_step(stmt) == SQLITE_ROW) {
       cout << setw(40) << sqlite3_column_text(stmt, 0) << " | ";
       cout << setw(30)
-           << lexical_cast<string>(Name(sqlite3_column_blob(stmt, 1), sqlite3_column_bytes(stmt, 1)))
+           << Name(Block(sqlite3_column_blob(stmt, 1), (sqlite3_column_bytes(stmt, 1)))).toUri()
            << " | ";
       cout << setw(6) << sqlite3_column_int64(stmt, 2) << " | ";
       cout << setw(10)
-           << Hash(sqlite3_column_blob(stmt, 3), sqlite3_column_bytes(stmt, 3)).shortHash() << " | ";
+           << toHex(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(stmt, 3)),
+                    sqlite3_column_bytes(stmt, 3))
+                .substr(0, 8)
+           << " | ";
       cout << setw(6) << sqlite3_column_int64(stmt, 6) << " | ";
       if (sqlite3_column_bytes(stmt, 7) == 0)
         cout << setw(20) << "<NULL>"
@@ -297,13 +321,13 @@
 int
 main(int argc, char* argv[])
 {
-  if (argc != 3 && !(argc == 5 && string(argv[1]) == "action")) {
+  if (argc != 3 && !(argc == 5 && std::string(argv[1]) == "action")) {
     cerr << "Usage: ./dump-db state|action|file|all <path-to-shared-folder>" << endl;
     cerr << "   or: ./dump-db action <path-to-shared-folder> <device-name> <seq-no>" << endl;
     return 1;
   }
 
-  string type = argv[1];
+  std::string type = argv[1];
   if (type == "state") {
     StateLogDumper dumper(argv[2]);
     dumper.DumpState();
@@ -312,7 +336,7 @@
   else if (type == "action") {
     ActionLogDumper dumper(argv[2]);
     if (argc == 5) {
-      dumper.DumpActionData(string(argv[3]), boost::lexical_cast<int64_t>(argv[4]));
+      dumper.DumpActionData(std::string(argv[3]), boost::lexical_cast<int64_t>(argv[4]));
     }
     else {
       dumper.Dump();
@@ -345,6 +369,14 @@
     return 1;
   }
 
-
   return 0;
 }
+
+} // namespace chronoshare
+} // namespace ndn
+
+int
+main(int argc, char* argv[])
+{
+  return ndn::chronoshare::main(argc, argv);
+}
