diff --git a/tools/ndngetfile.cpp b/tools/ndngetfile.cpp
index 9764ca6..559541c 100644
--- a/tools/ndngetfile.cpp
+++ b/tools/ndngetfile.cpp
@@ -47,14 +47,15 @@
   }
   else {
     interest.setMustBeFresh(true);
-    interest.setChildSelector(1);
   }
 
+  interest.setCanBePrefix(m_canBePrefix);
+
   m_face.expressInterest(interest,
-                         m_hasVersion ? bind(&Consumer::onVersionedData, this, _1, _2)
-                                      : bind(&Consumer::onUnversionedData, this, _1, _2),
-                         bind(&Consumer::onTimeout, this, _1), // Nack
-                         bind(&Consumer::onTimeout, this, _1));
+                         m_hasVersion ? std::bind(&Consumer::onVersionedData, this, _1, _2)
+                                      : std::bind(&Consumer::onUnversionedData, this, _1, _2),
+                         std::bind(&Consumer::onTimeout, this, _1), // Nack
+                         std::bind(&Consumer::onTimeout, this, _1));
 }
 
 void
@@ -112,7 +113,6 @@
 Consumer::onUnversionedData(const Interest& interest, const Data& data)
 {
   const Name& name = data.getName();
-  //std::cout<<"recevied data name = "<<name<<std::endl;
   if (name.size() == m_dataName.size() + 1) {
     if (!m_isSingle) {
       Name fetchName = name;
@@ -155,7 +155,7 @@
     std::cerr << "LOG: received data = " << data.getName() << std::endl;
   }
   if (m_isFinished || m_isSingle) {
-    std::cerr << "INFO: End of file is reached." << std::endl;
+    std::cerr << "INFO: End of file is reached" << std::endl;
     std::cerr << "INFO: Total # of segments received: " << m_nextSegment  << std::endl;
     std::cerr << "INFO: Total # bytes of content received: " << m_totalSize << std::endl;
   }
@@ -188,7 +188,7 @@
     // Retransmit the interest
     fetchData(interest.getName());
     if (m_verbose) {
-        std::cerr << "TIMEOUT: retransmit interest for " << interest.getName() << std::endl;
+      std::cerr << "TIMEOUT: retransmit interest for " << interest.getName() << std::endl;
     }
   }
   else {
@@ -240,7 +240,7 @@
           interestLifetime = boost::lexical_cast<int>(optarg);
         }
         catch (const boost::bad_lexical_cast&) {
-          std::cerr << "ERROR: -l option should be an integer." << std::endl;
+          std::cerr << "ERROR: -l option should be an integer" << std::endl;
           return 1;
         }
         interestLifetime = std::max(interestLifetime, 0);
@@ -250,7 +250,7 @@
           timeout = boost::lexical_cast<int>(optarg);
         }
         catch (const boost::bad_lexical_cast&) {
-          std::cerr << "ERROR: -w option should be an integer." << std::endl;
+          std::cerr << "ERROR: -w option should be an integer" << std::endl;
           return 1;
         }
         timeout = std::max(timeout, 0);
diff --git a/tools/ndngetfile.hpp b/tools/ndngetfile.hpp
index e7e851b..92cf799 100644
--- a/tools/ndngetfile.hpp
+++ b/tools/ndngetfile.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2017, Regents of the University of California.
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDN repo-ng (Next generation of NDN repository).
  * See AUTHORS.md for complete list of repo-ng authors and contributors.
@@ -30,7 +30,8 @@
   Consumer(const std::string& dataName, std::ostream& os,
            bool verbose, bool versioned, bool single,
            int interestLifetime, int timeout,
-           bool mustBeFresh = false)
+           bool mustBeFresh = false,
+           bool canBePrefix = false)
     : m_dataName(dataName)
     , m_os(os)
     , m_verbose(verbose)
@@ -44,6 +45,7 @@
     , m_totalSize(0)
     , m_retryCount(0)
     , m_mustBeFresh(mustBeFresh)
+    , m_canBePrefix(canBePrefix)
   {
   }
 
@@ -85,6 +87,7 @@
   int m_totalSize;
   int m_retryCount;
   bool m_mustBeFresh;
+  bool m_canBePrefix;
 };
 
 } // namespace repo
diff --git a/tools/ndnputfile.cpp b/tools/ndnputfile.cpp
index b4f40f4..97dbd77 100644
--- a/tools/ndnputfile.cpp
+++ b/tools/ndnputfile.cpp
@@ -33,9 +33,9 @@
 #include <iostream>
 #include <string>
 
+#include <boost/asio.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/lexical_cast.hpp>
-#include <boost/asio.hpp>
 #include <boost/iostreams/operations.hpp>
 #include <boost/iostreams/read.hpp>
 
@@ -161,7 +161,7 @@
   bool m_isFinished;
   ndn::Name m_dataPrefix;
 
-  typedef std::map<uint64_t, shared_ptr<ndn::Data> > DataContainer;
+  using DataContainer = std::map<uint64_t, shared_ptr<ndn::Data>>;
   DataContainer m_data;
   ndn::security::CommandInterestSigner m_cmdSigner;
 };
@@ -265,7 +265,6 @@
 NdnPutFile::onInsertCommandResponse(const ndn::Interest& interest, const ndn::Data& data)
 {
   RepoCommandResponse response(data.getContent().blockFromValue());
-  //int statusCode = response.getStatusCode();
   int statusCode = response.getCode();
   if (statusCode >= 400) {
     BOOST_THROW_EXCEPTION(Error("insert command failed with code " +
@@ -503,7 +502,7 @@
         ndnPutFile.freshnessPeriod = milliseconds(boost::lexical_cast<uint64_t>(optarg));
       }
       catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-x option should be an integer.";
+        std::cerr << "-x option should be an integer" << std::endl;;
         return 1;
       }
       break;
@@ -512,7 +511,7 @@
         ndnPutFile.interestLifetime = milliseconds(boost::lexical_cast<uint64_t>(optarg));
       }
       catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-l option should be an integer.";
+        std::cerr << "-l option should be an integer" << std::endl;;
         return 1;
       }
       break;
@@ -522,7 +521,7 @@
         ndnPutFile.timeout = milliseconds(boost::lexical_cast<uint64_t>(optarg));
       }
       catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-w option should be an integer.";
+        std::cerr << "-w option should be an integer" << std::endl;;
         return 1;
       }
       break;
@@ -543,10 +542,9 @@
   if (argc != 3)
     usage();
 
-  ndnPutFile.repoPrefix = Name(argv[0]); std::cout << "Repo prefix: " << argv[0] << std::endl;
-  ndnPutFile.ndnName = Name(argv[1]);    std::cout << "NDN name: " << argv[1] << std::endl;
+  ndnPutFile.repoPrefix = Name(argv[0]);
+  ndnPutFile.ndnName = Name(argv[1]);
   if (strcmp(argv[2], "-") == 0) {
-
     ndnPutFile.insertStream = &std::cin;
     ndnPutFile.run();
   }
diff --git a/tools/ndnrepowatch.cpp b/tools/ndnrepowatch.cpp
deleted file mode 100644
index b844c00..0000000
--- a/tools/ndnrepowatch.cpp
+++ /dev/null
@@ -1,420 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2018, Regents of the University of California.
- *
- * This file is part of NDN repo-ng (Next generation of NDN repository).
- * See AUTHORS.md for complete list of repo-ng authors and contributors.
- *
- * repo-ng is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * repo-ng is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * repo-ng, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "../src/repo-command-parameter.hpp"
-#include "../src/repo-command-response.hpp"
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/security/command-interest-signer.hpp>
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/security/signing-helpers.hpp>
-
-#include <boost/asio/io_service.hpp>
-#include <ndn-cxx/util/scheduler.hpp>
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <fstream>
-#include <iostream>
-#include <string>
-
-#include <boost/asio/io_service.hpp>
-#include <boost/lexical_cast.hpp>
-
-namespace repo {
-
-using namespace ndn::time;
-
-using std::shared_ptr;
-using std::bind;
-using std::placeholders::_1;
-using std::placeholders::_2;
-
-static const uint64_t DEFAULT_INTEREST_LIFETIME = 4000;
-static const uint64_t DEFAULT_FRESHNESS_PERIOD = 10000;
-static const uint64_t DEFAULT_CHECK_PERIOD = 1000;
-
-enum CommandType
-{
-  START,
-  CHECK,
-  STOP
-};
-
-class NdnRepoWatch : boost::noncopyable
-{
-public:
-  class Error : public std::runtime_error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : std::runtime_error(what)
-    {
-    }
-  };
-
-  NdnRepoWatch()
-    : freshnessPeriod(DEFAULT_FRESHNESS_PERIOD)
-    , interestLifetime(DEFAULT_INTEREST_LIFETIME)
-    , hasTimeout(false)
-    , watchTimeout(0)
-    , hasMaxInterestNum(false)
-    , maxInterestNum(0)
-    , status(START)
-    , isVerbose(false)
-    , m_scheduler(m_face.getIoService())
-    , m_checkPeriod(DEFAULT_CHECK_PERIOD)
-    , m_cmdSigner(m_keyChain)
-  {
-  }
-
-  void
-  run();
-
-private:
-
-  void
-  startWatchCommand();
-
-  void
-  onWatchCommandResponse(const ndn::Interest& interest, const ndn::Data& data);
-
-  void
-  onWatchCommandTimeout(const ndn::Interest& interest);
-
-  void
-  stopProcess();
-
-  void
-  signData(ndn::Data& data);
-
-  void
-  startCheckCommand();
-
-  void
-  onCheckCommandTimeout(const ndn::Interest& interest);
-
-  void
-  onStopCommandResponse(const ndn::Interest& interest, ndn::Data& data);
-
-  void
-  onStopCommandTimeout(const ndn::Interest& interest);
-
-  ndn::Interest
-  generateCommandInterest(const ndn::Name& commandPrefix, const std::string& command,
-                          const RepoCommandParameter& commandParameter);
-
-public:
-  std::string identityForCommand;
-  milliseconds freshnessPeriod;
-  milliseconds interestLifetime;
-  bool hasTimeout;
-  milliseconds watchTimeout;
-  bool hasMaxInterestNum;
-  int64_t maxInterestNum;
-  CommandType status;
-  ndn::Name repoPrefix;
-  ndn::Name ndnName;
-  bool isVerbose;
-
-
-private:
-  ndn::Face m_face;
-  ndn::Scheduler m_scheduler;
-  milliseconds m_checkPeriod;
-
-  ndn::Name m_dataPrefix;
-  ndn::KeyChain m_keyChain;
-  typedef std::map<uint64_t, shared_ptr<ndn::Data> > DataContainer;
-  ndn::security::CommandInterestSigner m_cmdSigner;
-};
-
-void
-NdnRepoWatch::run()
-{
-  m_dataPrefix = ndnName;
-  startWatchCommand();
-
-  if (hasTimeout)
-    m_scheduler.scheduleEvent(watchTimeout, bind(&NdnRepoWatch::stopProcess, this));
-
-  m_face.processEvents();
-}
-
-void
-NdnRepoWatch::startWatchCommand()
-{
-  RepoCommandParameter parameters;
-  parameters.setName(m_dataPrefix);
-
-  repoPrefix.append("watch");
-  if (status == START) {
-    if (hasMaxInterestNum) {
-      parameters.setMaxInterestNum(maxInterestNum);
-    }
-    if (hasTimeout) {
-      parameters.setWatchTimeout(watchTimeout);
-    }
-    ndn::Interest commandInterest = generateCommandInterest(repoPrefix, "start", parameters);
-    m_face.expressInterest(commandInterest,
-                           bind(&NdnRepoWatch::onWatchCommandResponse, this,
-                                     _1, _2),
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1), // Nack
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1));
-  }
-  else if (status == STOP){
-    ndn::Interest commandInterest = generateCommandInterest(repoPrefix, "stop", parameters);
-    m_face.expressInterest(commandInterest,
-                           bind(&NdnRepoWatch::onWatchCommandResponse, this,
-                                     _1, _2),
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1), // Nack
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1));
-  }
-  else if (status == CHECK){
-    ndn::Interest commandInterest = generateCommandInterest(repoPrefix, "check", parameters);
-    m_face.expressInterest(commandInterest,
-                           bind(&NdnRepoWatch::onWatchCommandResponse, this,
-                                     _1, _2),
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1), // Nack
-                           bind(&NdnRepoWatch::onWatchCommandTimeout, this, _1));
-  }
-
-}
-
-void
-NdnRepoWatch::onWatchCommandResponse(const ndn::Interest& interest, const ndn::Data& data)
-{
-  RepoCommandResponse response(data.getContent().blockFromValue());
-  int statusCode = response.getCode();
-  if (statusCode >= 400) {
-    BOOST_THROW_EXCEPTION(Error("Watch command failed with code " +
-                                boost::lexical_cast<std::string>(statusCode)));
-  }
-  else if (statusCode == 101) {
-    std::cerr << "Watching prefix is stopped!" <<std::endl;
-    m_face.getIoService().stop();
-    return;
-  }
-  else if (statusCode == 300) {
-    std::cerr << "Watching prefix is running!" <<std::endl;
-    m_scheduler.scheduleEvent(m_checkPeriod,
-                              bind(&NdnRepoWatch::startCheckCommand, this));
-    return;
-  }
-  else if (statusCode == 100) {
-    std::cerr << "Watching prefix starts!" <<std::endl;
-    m_scheduler.scheduleEvent(m_checkPeriod,
-                              bind(&NdnRepoWatch::startCheckCommand, this));
-    return;
-  }
-  else {
-    BOOST_THROW_EXCEPTION(Error("Unrecognized Status Code " +
-                                boost::lexical_cast<std::string>(statusCode)));
-  }
-}
-
-void
-NdnRepoWatch::onWatchCommandTimeout(const ndn::Interest& interest)
-{
-  BOOST_THROW_EXCEPTION(Error("command response timeout"));
-}
-
-void
-NdnRepoWatch::stopProcess()
-{
-  m_face.getIoService().stop();
-}
-
-void
-NdnRepoWatch::startCheckCommand()
-{
-  repoPrefix.append("watch");
-  ndn::Interest checkInterest = generateCommandInterest(repoPrefix, "check",
-                                                        RepoCommandParameter()
-                                                          .setName(m_dataPrefix));
-  m_face.expressInterest(checkInterest,
-                         bind(&NdnRepoWatch::onWatchCommandResponse, this, _1, _2),
-                         bind(&NdnRepoWatch::onCheckCommandTimeout, this, _1), // Nack
-                         bind(&NdnRepoWatch::onCheckCommandTimeout, this, _1));
-}
-
-void
-NdnRepoWatch::onCheckCommandTimeout(const ndn::Interest& interest)
-{
-  BOOST_THROW_EXCEPTION(Error("check response timeout"));
-}
-
-void
-NdnRepoWatch::onStopCommandResponse(const ndn::Interest& interest, ndn::Data& data)
-{
-  RepoCommandResponse response(data.getContent().blockFromValue());
-  int statusCode = response.getCode();
-  if (statusCode != 101) {
-    BOOST_THROW_EXCEPTION(Error("Watch stop command failed with code: " +
-                                boost::lexical_cast<std::string>(statusCode)));
-  }
-  else {
-    std::cerr << "Status code is 101. Watching prefix is stopped successfully!" << std::endl;
-    m_face.getIoService().stop();
-    return;
-  }
-}
-
-void
-NdnRepoWatch::onStopCommandTimeout(const ndn::Interest& interest)
-{
-  BOOST_THROW_EXCEPTION(Error("stop response timeout"));
-}
-
-ndn::Interest
-NdnRepoWatch::generateCommandInterest(const ndn::Name& commandPrefix, const std::string& command,
-                                      const RepoCommandParameter& commandParameter)
-{
-  Name cmd = commandPrefix;
-  cmd
-    .append(command)
-    .append(commandParameter.wireEncode());
-  ndn::Interest interest;
-
-  if (identityForCommand.empty())
-    interest = m_cmdSigner.makeCommandInterest(cmd);
-  else {
-    interest = m_cmdSigner.makeCommandInterest(cmd, ndn::signingByIdentity(identityForCommand));
-  }
-
-  interest.setInterestLifetime(interestLifetime);
-  return interest;
-}
-
-static void
-usage()
-{
-  fprintf(stderr,
-          "NdnRepoWatch [-I identity]"
-          "  [-x freshness] [-l lifetime] [-w watchtimeout]"
-          "  [-n maxinterestnum][-s stop] [-c check]repo-prefix ndn-name\n"
-          "\n"
-          " Write a file into a repo.\n"
-          "  -I: specify identity used for signing commands\n"
-          "  -x: FreshnessPeriod in milliseconds\n"
-          "  -l: InterestLifetime in milliseconds for each command\n"
-          "  -w: timeout in milliseconds for whole process (default unlimited)\n"
-          "  -n: total number of interests to be sent for whole process (default unlimited)\n"
-          "  -s: stop the whole process\n"
-          "  -c: check the process\n"
-          "  repo-prefix: repo command prefix\n"
-          "  ndn-name: NDN Name prefix for written Data\n"
-          );
-  exit(1);
-}
-
-int
-main(int argc, char** argv)
-{
-  NdnRepoWatch app;
-  int opt;
-  while ((opt = getopt(argc, argv, "x:l:w:n:scI:")) != -1) {
-    switch (opt) {
-    case 'x':
-      try {
-        app.freshnessPeriod = milliseconds(boost::lexical_cast<uint64_t>(optarg));
-      }
-      catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-x option should be an integer.";
-        return 1;
-      }
-      break;
-    case 'l':
-      try {
-        app.interestLifetime = milliseconds(boost::lexical_cast<uint64_t>(optarg));
-      }
-      catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-l option should be an integer.";
-        return 1;
-      }
-      break;
-    case 'w':
-      app.hasTimeout = true;
-      try {
-        app.watchTimeout = milliseconds(boost::lexical_cast<int64_t>(optarg));
-      }
-      catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-w option should be an integer.";
-        return 1;
-      }
-      break;
-    case 'n':
-      app.hasMaxInterestNum = true;
-      try {
-        app.maxInterestNum = boost::lexical_cast<int64_t>(optarg);
-      }
-      catch (const boost::bad_lexical_cast&) {
-        std::cerr << "-n option should be an integer.";
-        return 1;
-      }
-      break;
-    case 's':
-      app.status = STOP;
-      break;
-    case 'c':
-      app.status = CHECK;
-      break;
-    case 'I':
-      app.identityForCommand = std::string(optarg);
-      break;
-    case 'v':
-      app.isVerbose = true;
-      break;
-    case 'h':
-      usage();
-      break;
-    default:
-      break;
-    }
-  }
-
-  argc -= optind;
-  argv += optind;
-
-  if (argc != 2)
-    usage();
-
-  app.repoPrefix = Name(argv[0]);
-  app.ndnName = Name(argv[1]);
-
-  app.run();
-
-  return 0;
-}
-
-} // namespace repo
-
-int
-main(int argc, char** argv)
-{
-  try {
-    return repo::main(argc, argv);
-  }
-  catch (const std::exception& e) {
-    std::cerr << "ERROR: " << e.what() << std::endl;
-    return 2;
-  }
-}
diff --git a/tools/repo-ng-ls.cpp b/tools/repo-ng-ls.cpp
index 1ce0b28..637b03f 100644
--- a/tools/repo-ng-ls.cpp
+++ b/tools/repo-ng-ls.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017, Regents of the University of California.
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDN repo-ng (Next generation of NDN repository).
  * See AUTHORS.md for complete list of repo-ng authors and contributors.
@@ -23,6 +23,8 @@
 #include <iostream>
 #include <string>
 
+#include <ndn-cxx/util/sqlite3-statement.hpp>
+
 #include <boost/property_tree/info_parser.hpp>
 #include <boost/property_tree/ptree.hpp>
 
@@ -30,8 +32,6 @@
 
 namespace repo {
 
-using std::string;
-
 static void
 printUsage(const char* programName)
 {
@@ -80,20 +80,19 @@
 RepoEnumerator::RepoEnumerator(const std::string& configFile)
 {
   readConfig(configFile);
-  char* errMsg = 0;
-  int rc = sqlite3_open_v2(m_dbPath.c_str(), &m_db,
-                           SQLITE_OPEN_READONLY,
+  char* errMsg = nullptr;
+  int rc = sqlite3_open_v2(m_dbPath.c_str(), &m_db, SQLITE_OPEN_READONLY,
    #ifdef DISABLE_SQLITE3_FS_LOCKING
-                            "unix-dotfile"
+                           "unix-dotfile"
    #else
-                            0
+                           nullptr
    #endif
                           );
   if (rc != SQLITE_OK) {
     BOOST_THROW_EXCEPTION(Error("Database file open failure"));
   }
-  sqlite3_exec(m_db, "PRAGMA synchronous = OFF", 0, 0, &errMsg);
-  sqlite3_exec(m_db, "PRAGMA journal_mode = WAL", 0, 0, &errMsg);
+  sqlite3_exec(m_db, "PRAGMA synchronous = OFF", nullptr, nullptr, &errMsg);
+  sqlite3_exec(m_db, "PRAGMA journal_mode = WAL", nullptr, nullptr, &errMsg);
 }
 
 void
@@ -123,49 +122,34 @@
 uint64_t
 RepoEnumerator::enumerate(bool showImplicitDigest)
 {
-  sqlite3_stmt* m_stmt = 0;
-  int rc = SQLITE_DONE;
-  string sql = string("SELECT id, name, keylocatorHash FROM NDN_REPO;");
-  rc = sqlite3_prepare_v2(m_db, sql.c_str(), -1, &m_stmt, 0);
-  if (rc != SQLITE_OK)
-    BOOST_THROW_EXCEPTION(Error("Initiation Read Entries from Database Prepare error"));
-  uint64_t entryNumber = 0;
+  ndn::util::Sqlite3Statement stmt(m_db, "SELECT data FROM NDN_REPO_V2;");
+  uint64_t nEntries = 0;
   while (true) {
-    rc = sqlite3_step(m_stmt);
+    int rc = stmt.step();
     if (rc == SQLITE_ROW) {
-      Name name;
-      name.wireDecode(Block(reinterpret_cast<const uint8_t*>(sqlite3_column_blob(m_stmt, 1)),
-                            sqlite3_column_bytes(m_stmt, 1)));
-      try {
-        if (showImplicitDigest) {
-          std::cout << name << std::endl;
-        }
-        else {
-          std::cout << name.getPrefix(-1) << std::endl;
-        }
+      Data data(stmt.getBlock(0));
+      if (showImplicitDigest) {
+        std::cout << data.getFullName() << std::endl;
       }
-      catch (...){
-        sqlite3_finalize(m_stmt);
-        throw;
+      else {
+        std::cout << data.getName() << std::endl;
       }
-      entryNumber++;
+      nEntries++;
     }
     else if (rc == SQLITE_DONE) {
-      sqlite3_finalize(m_stmt);
       break;
     }
     else {
-      sqlite3_finalize(m_stmt);
       BOOST_THROW_EXCEPTION(Error("Initiation Read Entries error"));
     }
   }
-  return entryNumber;
+  return nEntries;
 }
 
 int
 main(int argc, char** argv)
 {
-  string configPath = DEFAULT_CONFIG_FILE;
+  std::string configPath = DEFAULT_CONFIG_FILE;
   bool showImplicitDigest = true;
   int opt;
   while ((opt = getopt(argc, argv, "hc:n")) != -1) {
@@ -174,7 +158,7 @@
       printUsage(argv[0]);
       return 0;
     case 'c':
-      configPath = string(optarg);
+      configPath = std::string(optarg);
       break;
     case 'n':
       showImplicitDigest = false;
