diff --git a/src/access-manager.cpp b/src/access-manager.cpp
index 3ab89f0..5fb34ab 100644
--- a/src/access-manager.cpp
+++ b/src/access-manager.cpp
@@ -80,7 +80,7 @@
   m_face.unsetInterestFilter(m_kdkRegId);
 }
 
-void
+Data
 AccessManager::addMember(const Certificate& memberCert)
 {
   Name kdkName(m_nacKey.getIdentity());
@@ -118,6 +118,8 @@
   m_keyChain.sign(*kdk, signingByIdentity(m_identity));
 
   m_ims.insert(*kdk);
+
+  return *kdk;
 }
 
 void
diff --git a/src/access-manager.hpp b/src/access-manager.hpp
index 6f77d4c..d2a6f74 100644
--- a/src/access-manager.hpp
+++ b/src/access-manager.hpp
@@ -75,8 +75,9 @@
   /**
    * @brief Authorize a member identified by its certificate @p memberCert to decrypt data
    *        under the policy
+   * @return published KDK
    */
-  void
+  Data
   addMember(const Certificate& memberCert);
 
   // void
diff --git a/src/version.hpp.in b/src/version.hpp.in
new file mode 100644
index 0000000..2e207ea
--- /dev/null
+++ b/src/version.hpp.in
@@ -0,0 +1,68 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2014 Regents of the University of California.
+ *
+ * This file is part of ndn-nac library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-nac library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-nac library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-nac, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-nac authors and contributors.
+ */
+
+#ifndef NAC_VERSION_HPP
+#define NAC_VERSION_HPP
+
+namespace ndn {
+
+/** ndn-nac version follows Semantic Versioning 2.0.0 specification
+ *  http://semver.org/
+ */
+
+/** \brief ndn-nac version represented as an integer
+ *
+ *  MAJOR*1000000 + MINOR*1000 + PATCH
+ */
+#define NDN_NAC_VERSION @VERSION@
+
+/** \brief ndn-nac version represented as a string
+ *
+ *  MAJOR.MINOR.PATCH
+ */
+#define NDN_NAC_VERSION_STRING "@VERSION_STRING@"
+
+/** \brief ndn-nac version string, including git commit information, if ndn-nac is build from
+ *         specific git commit
+ *
+ * NDN_NAC_VERSION_BUILD_STRING is obtained using the following command (`ndn-nac-` prefix is
+ * afterwards removed):
+ *
+ *    `git describe --match 'ndn-nac-*'`
+ *
+ * When ndn-nac is built not from git, NDN_NAC_VERSION_BUILD_STRING equals NDN_NAC_VERSION_STRING
+ *
+ * MAJOR.MINOR.PATCH(-release-candidate-tag)(-(number-of-commits-since-tag)-COMMIT-HASH)
+ *
+ * Example, 0.1.0-rc1-1-g5c86570
+ */
+#define NDN_NAC_VERSION_BUILD_STRING "@VERSION_BUILD@"
+
+/// MAJOR version
+#define NDN_NAC_VERSION_MAJOR @VERSION_MAJOR@
+/// MINOR version
+#define NDN_NAC_VERSION_MINOR @VERSION_MINOR@
+/// PATCH version
+#define NDN_NAC_VERSION_PATCH @VERSION_PATCH@
+
+} // namespace ndn
+
+#endif // NAC_VERSION_HPP
diff --git a/tools/ndn-nac/add-member.cpp b/tools/ndn-nac/add-member.cpp
new file mode 100644
index 0000000..cc8455c
--- /dev/null
+++ b/tools/ndn-nac/add-member.cpp
@@ -0,0 +1,107 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2018, Regents of the University of California
+ *
+ * NAC library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * NAC library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of NAC library authors and contributors.
+ */
+
+#include "ndn-nac.hpp"
+#include "access-manager.hpp"
+
+namespace ndn {
+namespace nac {
+
+int
+nac_add_member(int argc, char** argv)
+{
+  namespace po = boost::program_options;
+
+  Name identityName;
+  Name datasetName;
+  std::string output;
+  std::string member;
+
+  po::options_description description("General Usage\n"
+                                      "  ndn-nac add-member [-h] [-o output] [-d dataset] [-i] identity [-m] memberCert\n"
+                                      "General options");
+  description.add_options()
+    ("help,h", "Produce help message")
+    ("output,o", po::value<std::string>(&output), "(Optional) output file, stdout if not specified")
+    ("identity,i", po::value<Name>(&identityName), "Data owner's namespace identity")
+    ("dataset,d", po::value<Name>(&datasetName), "Name of dataset to control")
+    ("member,m", po::value<std::string>(&member), "File with member's certificate, stdin if -")
+    ;
+
+  po::positional_options_description p;
+  p.add("identity", 1);
+  p.add("member", 1);
+
+  po::variables_map vm;
+  try {
+    po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(), vm);
+    po::notify(vm);
+  }
+  catch (const std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    std::cerr << description << std::endl;
+    return 1;
+  }
+
+  if (vm.count("help") != 0) {
+    std::cerr << description << std::endl;
+    return 0;
+  }
+
+  if (vm.count("identity") == 0) {
+    std::cerr << "ERROR: identity must be specified" << std::endl;
+    std::cerr << description << std::endl;
+    return 1;
+  }
+
+  if (vm.count("member") == 0) {
+    std::cerr << "ERROR: member must be specified" << std::endl;
+    std::cerr << description << std::endl;
+    return 1;
+  }
+
+  if (vm.count("output") == 0)
+    output = "-";
+
+  try {
+    security::v2::KeyChain keyChain;
+    security::Identity id = keyChain.getPib().getIdentity(identityName);
+
+    auto cert = loadCertificate(member);
+
+    util::DummyClientFace face(keyChain); // to avoid any real IO
+    AccessManager manager(id, datasetName, keyChain, face);
+
+    auto kdk = manager.addMember(cert);
+
+    if (output == "-")
+      io::save(kdk, std::cout);
+    else
+      io::save(kdk, output);
+
+    return 0;
+  }
+  catch (const std::runtime_error& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    return 1;
+  }
+}
+
+} // namespace nac
+} // namespace ndn
diff --git a/tools/ndn-nac/dump-kek.cpp b/tools/ndn-nac/dump-kek.cpp
new file mode 100644
index 0000000..5d3c35e
--- /dev/null
+++ b/tools/ndn-nac/dump-kek.cpp
@@ -0,0 +1,99 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2018, Regents of the University of California
+ *
+ * NAC library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * NAC library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of NAC library authors and contributors.
+ */
+
+#include "ndn-nac.hpp"
+#include "access-manager.hpp"
+
+namespace ndn {
+namespace nac {
+
+int
+nac_dump_kek(int argc, char** argv)
+{
+  namespace po = boost::program_options;
+
+  Name identityName;
+  Name datasetName;
+  std::string output;
+
+  po::options_description description("General Usage\n"
+                                      "  ndn-nac dump-kek [-h] [-o output] [-d dataset] [-i] identity \n"
+                                      "General options");
+  description.add_options()
+    ("help,h", "Produce help message")
+    ("output,o", po::value<std::string>(&output), "(Optional) output file, stdout if not specified")
+    ("identity,i", po::value<Name>(&identityName), "Data owner's namespace identity")
+    ("dataset,d", po::value<Name>(&datasetName), "Name of dataset to control")
+    ;
+
+  po::positional_options_description p;
+  p.add("identity", 1);
+
+  po::variables_map vm;
+  try {
+    po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(), vm);
+    po::notify(vm);
+  }
+  catch (const std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    std::cerr << description << std::endl;
+    return 1;
+  }
+
+  if (vm.count("help") != 0) {
+    std::cerr << description << std::endl;
+    return 0;
+  }
+
+  if (vm.count("identity") == 0) {
+    std::cerr << "ERROR: identity must be specified" << std::endl;
+    std::cerr << description << std::endl;
+    return 1;
+  }
+
+  if (vm.count("output") == 0)
+    output = "-";
+
+  try {
+    security::v2::KeyChain keyChain;
+    security::Identity id = keyChain.getPib().getIdentity(identityName);
+
+    util::DummyClientFace face(keyChain); // to avoid any real IO
+    AccessManager manager(id, datasetName, keyChain, face);
+
+    if (manager.size() != 1) {
+      std::cerr << "ERROR: Incorrect state of AccessManager instance (expect 1 KDK)" << std::endl;
+      return 2;
+    }
+
+    if (output == "-")
+      io::save(*manager.begin(), std::cout);
+    else
+      io::save(*manager.begin(), output);
+
+    return 0;
+  }
+  catch (const std::runtime_error& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    return 1;
+  }
+}
+
+} // namespace nac
+} // namespace ndn
diff --git a/tools/ndn-nac/main.cpp b/tools/ndn-nac/main.cpp
new file mode 100644
index 0000000..0ebe9ed
--- /dev/null
+++ b/tools/ndn-nac/main.cpp
@@ -0,0 +1,76 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2018, Regents of the University of California
+ *
+ * NAC library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * NAC library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of NAC library authors and contributors.
+ */
+
+#include "ndn-nac.hpp"
+#include "version.hpp"
+
+#include <boost/exception/get_error_info.hpp>
+#include <ndn-cxx/util/logger.hpp>
+
+NDN_LOG_INIT(nac.Cmd);
+
+std::string nac_helper = R"STR(
+  help         Show all commands
+  version      Show version and exit
+  dump-kek     Dump KEK
+  add-member   Create KDK for the member
+)STR";
+
+int
+main(int argc, char** argv)
+{
+  if (argc < 2) {
+    std::cerr << nac_helper << std::endl;
+    return 1;
+  }
+
+  using namespace ndn::nac;
+
+  std::string command(argv[1]);
+  try {
+    if (command == "help")              { std::cout << nac_helper << std::endl; }
+    else if (command == "version")      { std::cout << NDN_NAC_VERSION_BUILD_STRING << std::endl; }
+    else if (command == "dump-kek")     { return nac_dump_kek(argc - 1, argv + 1); }
+    else if (command == "add-member")   { return nac_add_member(argc - 1, argv + 1); }
+    else {
+      std::cerr << nac_helper << std::endl;
+      return 1;
+    }
+  }
+  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());
+    return 1;
+  }
+
+  return 0;
+}
diff --git a/tools/ndn-nac/ndn-nac.hpp b/tools/ndn-nac/ndn-nac.hpp
new file mode 100644
index 0000000..3f70bbd
--- /dev/null
+++ b/tools/ndn-nac/ndn-nac.hpp
@@ -0,0 +1,65 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2018, Regents of the University of California
+ *
+ * NAC library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * NAC library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of NAC library authors and contributors.
+ */
+
+#ifndef NAC_TOOLS_NDN_NAC_NDN_NAC_HPP
+#define NAC_TOOLS_NDN_NAC_NDN_NAC_HPP
+
+#include "common.hpp"
+
+#include <fstream>
+#include <iostream>
+#include <string>
+
+#include <boost/asio.hpp>
+#include <boost/exception/all.hpp>
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/parsers.hpp>
+#include <boost/program_options/variables_map.hpp>
+
+#include <ndn-cxx/util/dummy-client-face.hpp>
+#include <ndn-cxx/util/io.hpp>
+
+namespace ndn {
+namespace nac {
+
+int
+nac_dump_kek(int argc, char** argv);
+
+int
+nac_add_member(int argc, char** argv);
+
+inline security::v2::Certificate
+loadCertificate(const std::string& fileName)
+{
+  shared_ptr<security::v2::Certificate> cert;
+  if (fileName == "-")
+    cert = io::load<security::v2::Certificate>(std::cin);
+  else
+    cert = io::load<security::v2::Certificate>(fileName);
+
+  if (cert == nullptr) {
+    BOOST_THROW_EXCEPTION(std::runtime_error("Cannot load certificate from " + fileName));
+  }
+  return *cert;
+}
+
+} // namespace nac
+} // namespace ndn
+
+#endif // NAC_TOOLS_NDN_NAC_NDN_NAC_HPP
diff --git a/tools/wscript b/tools/wscript
new file mode 100644
index 0000000..ca28aa5
--- /dev/null
+++ b/tools/wscript
@@ -0,0 +1,59 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Utils
+
+top = '..'
+
+def build(bld):
+    # Single object tools:
+    # tools/example-tool.cpp is a self-contained tool with a main() function
+    # and is built as build/bin/example-tool.
+    # These tools cannot be unit-tested.
+    for tool in bld.path.ant_glob('*.cpp'):
+        name = tool.change_ext('').path_from(bld.path.get_bld())
+        bld.program(name=name,
+                    target='../bin/%s' % name,
+                    source=[tool],
+                    use='NDN_CXX libndn-nac')
+
+    # Sub-directory tools:
+    # tools/example-tool/**/*.cpp is compiled and linked into build/bin/example-tool.
+    # tools/example-tool/main.cpp must exist and must contain the main() function.
+    # All other objects are collected into 'tools-objects' and can be unit-tested.
+    testableObjects = []
+    for subdir in bld.path.ant_glob('*', dir=True, src=False):
+        mainFile = subdir.find_node('main.cpp')
+        if mainFile is None:
+            continue # not a C++ tool
+
+        name = subdir.path_from(bld.path)
+        srcFiles = subdir.ant_glob('**/*.cpp', excl=['main.cpp'])
+        srcObjects = ''
+        if srcFiles:
+            srcObjects = 'tools-%s-objects' % name
+            bld.objects(target=srcObjects,
+                        source=srcFiles,
+                        use='NDN_CXX libndn-nac',
+                        includes=name)
+            testableObjects.append(srcObjects)
+
+        bld.program(name=name,
+                    target='../bin/%s' % name,
+                    source=[mainFile],
+                    use='NDN_CXX libndn-nac ' + srcObjects,
+                    includes=name)
+
+    bld.objects(target='tools-objects',
+                source=[],
+                export_includes='.',
+                use=testableObjects)
+
+    # Tool wrappers
+    wrapperFiles = bld.path.ant_glob('wrapper/*.sh')
+    bld(name='wrappers',
+        features='subst',
+        source=wrapperFiles,
+        target=['../bin/%s' % node.change_ext('', '.sh').path_from(bld.path.find_dir('wrapper').get_bld())
+                for node in wrapperFiles],
+        install_path='${BINDIR}',
+        chmod=Utils.O755)
diff --git a/wscript b/wscript
index 8931c7a..f1bfbb3 100644
--- a/wscript
+++ b/wscript
@@ -52,6 +52,20 @@
 def build(bld):
     version(bld)
 
+    bld(features='subst',
+        name='version.hpp',
+        source='src/version.hpp.in',
+        target='src/version.hpp',
+        install_path=None,
+        VERSION_STRING=VERSION_BASE,
+        VERSION_BUILD=VERSION,
+        VERSION=int(VERSION_SPLIT[0]) * 1000000 +
+                int(VERSION_SPLIT[1]) * 1000 +
+                int(VERSION_SPLIT[2]),
+        VERSION_MAJOR=VERSION_SPLIT[0],
+        VERSION_MINOR=VERSION_SPLIT[1],
+        VERSION_PATCH=VERSION_SPLIT[2])
+
     bld.shlib(
         target="ndn-nac",
         name="libndn-nac",
@@ -66,6 +80,8 @@
     if bld.env['WITH_TESTS']:
         bld.recurse('tests')
 
+    bld.recurse('tools')
+
     bld.install_files(
         dest = "%s/ndn-nac" % bld.env['INCLUDEDIR'],
         files = bld.path.ant_glob(['src/**/*.hpp', 'src/**/*.h', 'common.hpp']),
