diff --git a/tools/ndnsec/main.cpp b/tools/ndnsec/main.cpp
index d2bc281..8548748 100644
--- a/tools/ndnsec/main.cpp
+++ b/tools/ndnsec/main.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -25,74 +25,66 @@
 #include "ndn-cxx/util/logger.hpp"
 #include "ndn-cxx/version.hpp"
 
-#include <boost/exception/get_error_info.hpp>
+#include <boost/exception/diagnostic_information.hpp>
 
 NDN_LOG_INIT(ndnsec);
 
-std::string ndnsec_helper = R"STR(\
-  help         Show all commands
-  version      Show version and exit
-  list         Display information in PublicInfo
-  get-default  Get default setting info
-  set-default  Configure default setting
-  key-gen      Generate a Key-Signing-Key for an identity
-  sign-req     Generate a certificate signing request
-  cert-gen     Generate an identity certificate
-  cert-dump    Dump a certificate from PublicInfo
-  cert-install Install a certificate into PublicInfo
-  delete       Delete identity/key/certificate
-  export       Export an identity package
-  import       Import an identity package
-  unlock-tpm   Unlock Tpm
-)STR";
+const char NDNSEC_HELP_TEXT[] = R"STR(Usage: ndnsec COMMAND [OPTION]...
+
+Available commands:
+  help           Print this help text
+  version        Print program version
+  list           List all known identities/keys/certificates
+  get-default    Show the default identity/key/certificate
+  set-default    Change the default identity/key/certificate
+  delete         Delete an identity/key/certificate
+  key-gen        Generate a key for an identity
+  sign-req       Generate a certificate signing request
+  cert-gen       Create a certificate for an identity
+  cert-dump      Export a certificate
+  cert-install   Import a certificate from a file
+  export         Export an identity as a SafeBag
+  import         Import an identity from a SafeBag
+  unlock-tpm     Unlock the TPM
+
+Try 'ndnsec COMMAND --help' for more information on each command.)STR";
 
 int
-main(int argc, char** argv)
+main(int argc, char* argv[])
 {
   if (argc < 2) {
-    std::cerr << ndnsec_helper << std::endl;
-    return 1;
+    std::cerr << NDNSEC_HELP_TEXT << std::endl;
+    return 2;
   }
 
   using namespace ndn::ndnsec;
 
   std::string command(argv[1]);
   try {
-    if (command == "help")              { std::cout << ndnsec_helper << std::endl; }
+    if (command == "help")              { std::cout << NDNSEC_HELP_TEXT << std::endl; }
     else if (command == "version")      { std::cout << NDN_CXX_VERSION_BUILD_STRING << std::endl; }
     else if (command == "list")         { return ndnsec_list(argc - 1, argv + 1); }
     else if (command == "get-default")  { return ndnsec_get_default(argc - 1, argv + 1); }
     else if (command == "set-default")  { return ndnsec_set_default(argc - 1, argv + 1); }
+    else if (command == "delete")       { return ndnsec_delete(argc - 1, argv + 1); }
     else if (command == "key-gen")      { return ndnsec_key_gen(argc - 1, argv + 1); }
     else if (command == "sign-req")     { return ndnsec_sign_req(argc - 1, argv + 1); }
     else if (command == "cert-gen")     { return ndnsec_cert_gen(argc - 1, argv + 1); }
     else if (command == "cert-dump")    { return ndnsec_cert_dump(argc - 1, argv + 1); }
     else if (command == "cert-install") { return ndnsec_cert_install(argc - 1, argv + 1); }
-    else if (command == "delete")       { return ndnsec_delete(argc - 1, argv + 1); }
     else if (command == "export")       { return ndnsec_export(argc - 1, argv + 1); }
     else if (command == "import")       { return ndnsec_import(argc - 1, argv + 1); }
     else if (command == "unlock-tpm")   { return ndnsec_unlock_tpm(argc - 1, argv + 1); }
     else {
-      std::cerr << ndnsec_helper << std::endl;
-      return 1;
+      std::cerr << "ERROR: Unknown command '" << command << "'\n"
+                << "\n"
+                << NDNSEC_HELP_TEXT << std::endl;
+      return 2;
     }
   }
   catch (const std::exception& e) {
-
-    std::cerr << "ERROR: " << e.what();
-
-    std::ostringstream extendedError;
-    const char* const* file = boost::get_error_info<boost::throw_file>(e);
-    const int* line = boost::get_error_info<boost::throw_line>(e);
-    const char* const* func = boost::get_error_info<boost::throw_function>(e);
-    if (file && line) {
-      extendedError << " [from " << *file << ":" << *line;
-      if (func) {
-        extendedError << " in " << *func;
-      }
-      extendedError << "]";
-    }
-    NDN_LOG_ERROR(e.what() << extendedError.str());
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    NDN_LOG_ERROR(boost::diagnostic_information(e));
     return 1;
   }
 
