A few code reorganizations

Change-Id: If4632fecc7085e5448226c2061e08546757eda9b
diff --git a/common.hpp b/common.hpp
index a3cf9fb..40a48ce 100644
--- a/common.hpp
+++ b/common.hpp
@@ -54,7 +54,8 @@
 #include <boost/property_tree/ptree.hpp>
 #include <boost/scoped_ptr.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 using std::size_t;
 
@@ -88,6 +89,7 @@
 namespace name = ndn::name;
 namespace time = ndn::time;
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_COMMON_HPP
diff --git a/core/auditor.cpp b/core/auditor.cpp
index b2db2b7..ce17b04 100644
--- a/core/auditor.cpp
+++ b/core/auditor.cpp
@@ -23,7 +23,8 @@
 
 #include <ndn-cxx/util/digest.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 bool
 Auditor::doesExist(const NonNegativeInteger& seqNo,
@@ -74,7 +75,7 @@
   size_t childLevel = 0;
   ndn::ConstBufferPtr childHash = hash;
 
-  NonNegativeInteger parentSeqMask = (~0) << 1;
+  NonNegativeInteger parentSeqMask = (~0ul) << 1;
   NonNegativeInteger parentSeqNo = childSeqNo & parentSeqMask;
   size_t parentLevel = 1;
 
@@ -237,4 +238,5 @@
   return true;
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/auditor.hpp b/core/auditor.hpp
index 87e67b5..f47e856 100644
--- a/core/auditor.hpp
+++ b/core/auditor.hpp
@@ -29,7 +29,8 @@
 #include <ndn-cxx/encoding/buffer.hpp>
 #include <vector>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class Auditor
 {
@@ -57,6 +58,7 @@
             const Name& loggerName);
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_AUDITOR_HPP
diff --git a/core/conf/checker.cpp b/core/conf/checker.cpp
index d00bb34..30d6d2b 100644
--- a/core/conf/checker.cpp
+++ b/core/conf/checker.cpp
@@ -23,7 +23,8 @@
 
 #include <boost/algorithm/string.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 Checker::~Checker()
@@ -173,4 +174,5 @@
 }
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/conf/checker.hpp b/core/conf/checker.hpp
index 17117aa..f618f92 100644
--- a/core/conf/checker.hpp
+++ b/core/conf/checker.hpp
@@ -30,7 +30,8 @@
 #include <boost/filesystem.hpp>
 #include <boost/lexical_cast.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 class Checker
@@ -93,6 +94,7 @@
 };
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_CHECKER_HPP
diff --git a/core/conf/config-file.cpp b/core/conf/config-file.cpp
index ffb8051..fd1902b 100644
--- a/core/conf/config-file.cpp
+++ b/core/conf/config-file.cpp
@@ -22,7 +22,8 @@
 #include "config-file.hpp"
 #include <boost/property_tree/info_parser.hpp>
 #include <boost/filesystem.hpp>
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 ConfigFile::ConfigFile(const std::string& filename)
@@ -94,4 +95,5 @@
 }
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/conf/config-file.hpp b/core/conf/config-file.hpp
index e86def2..1ed2fab 100644
--- a/core/conf/config-file.hpp
+++ b/core/conf/config-file.hpp
@@ -25,7 +25,8 @@
 #include "common.hpp"
 #include "config.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 class ConfigFile
 {
@@ -74,6 +75,7 @@
 };
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_CONFIG_FILE_HPP
diff --git a/core/conf/config.hpp b/core/conf/config.hpp
index 7bffe63..c515d70 100644
--- a/core/conf/config.hpp
+++ b/core/conf/config.hpp
@@ -24,7 +24,8 @@
 
 #include <boost/property_tree/ptree.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 typedef boost::property_tree::ptree ConfigSection;
@@ -40,6 +41,7 @@
 };
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_CONFIG_HPP
diff --git a/core/conf/filter.cpp b/core/conf/filter.cpp
index 7f4c945..bb18236 100644
--- a/core/conf/filter.cpp
+++ b/core/conf/filter.cpp
@@ -23,7 +23,8 @@
 
 #include <boost/algorithm/string.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 Filter::~Filter()
@@ -154,4 +155,5 @@
 }
 
 } // namespace conf
+} // namespace delorean
 } // namespace ndn
diff --git a/core/conf/filter.hpp b/core/conf/filter.hpp
index 65a58ce..7c26720 100644
--- a/core/conf/filter.hpp
+++ b/core/conf/filter.hpp
@@ -26,7 +26,8 @@
 #include "config.hpp"
 #include <ndn-cxx/util/regex.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 /**
@@ -105,6 +106,7 @@
 };
 
 } // namespace conf
+} // namespace delorean
 } // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_FILTER_HPP
diff --git a/core/conf/key-locator-checker.cpp b/core/conf/key-locator-checker.cpp
index 8e21677..c2f808d 100644
--- a/core/conf/key-locator-checker.cpp
+++ b/core/conf/key-locator-checker.cpp
@@ -23,7 +23,8 @@
 
 #include <boost/algorithm/string.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 KeyLocatorChecker::~KeyLocatorChecker()
@@ -274,4 +275,5 @@
 }
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/conf/key-locator-checker.hpp b/core/conf/key-locator-checker.hpp
index 97f270b..7cc2937 100644
--- a/core/conf/key-locator-checker.hpp
+++ b/core/conf/key-locator-checker.hpp
@@ -26,7 +26,8 @@
 #include "config.hpp"
 #include <ndn-cxx/util/regex.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 class KeyLocatorCheckerFactory;
@@ -122,6 +123,7 @@
 
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_KEY_LOCATOR_CHECKER_HPP
diff --git a/core/conf/rule.cpp b/core/conf/rule.cpp
index 55dc59d..efaac3e 100644
--- a/core/conf/rule.cpp
+++ b/core/conf/rule.cpp
@@ -21,7 +21,8 @@
 
 #include "rule.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 Rule::Rule(const std::string& id)
@@ -78,4 +79,5 @@
 }
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/conf/rule.hpp b/core/conf/rule.hpp
index 47a70fd..2133efe 100644
--- a/core/conf/rule.hpp
+++ b/core/conf/rule.hpp
@@ -25,7 +25,8 @@
 #include "filter.hpp"
 #include "checker.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace conf {
 
 class Rule
@@ -68,6 +69,7 @@
 };
 
 } // namespace conf
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CONF_RULE_HPP
diff --git a/core/db.cpp b/core/db.cpp
index 22474df..d87707f 100644
--- a/core/db.cpp
+++ b/core/db.cpp
@@ -25,7 +25,8 @@
 #include <string>
 #include <boost/filesystem.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 static const std::string INITIALIZATION =
   "CREATE TABLE IF NOT EXISTS                    \n"
@@ -306,4 +307,5 @@
   return m_nextLeafSeqNo;
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/db.hpp b/core/db.hpp
index b722efe..071371f 100644
--- a/core/db.hpp
+++ b/core/db.hpp
@@ -29,7 +29,8 @@
 
 struct sqlite3;
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class Db : noncopyable
 {
@@ -79,6 +80,7 @@
   NonNegativeInteger m_nextLeafSeqNo;
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_DB_HPP
diff --git a/core/leaf.cpp b/core/leaf.cpp
index 36dd275..1046b15 100644
--- a/core/leaf.cpp
+++ b/core/leaf.cpp
@@ -25,7 +25,8 @@
 #include <ndn-cxx/encoding/block-helpers.hpp>
 #include <ndn-cxx/util/crypto.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 const Name Leaf::EMPTY_NAME;
 const size_t Leaf::N_LOGGER_LEAF_SUFFIX = 4;
@@ -251,4 +252,5 @@
     throw Error("No more sub-TLV in LoggerLeaf");
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/leaf.hpp b/core/leaf.hpp
index 4ee11d3..fa07cab 100644
--- a/core/leaf.hpp
+++ b/core/leaf.hpp
@@ -27,7 +27,8 @@
 #include "util/timestamp.hpp"
 #include <ndn-cxx/encoding/buffer.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class Leaf
 {
@@ -138,6 +139,7 @@
   Name m_loggerName;
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_LEAF_HPP
diff --git a/core/logger-response.cpp b/core/logger-response.cpp
index c36f932..4b67ed5 100644
--- a/core/logger-response.cpp
+++ b/core/logger-response.cpp
@@ -22,7 +22,8 @@
 #include "logger-response.hpp"
 #include "tlv.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 LoggerResponse::LoggerResponse()
   : m_code(-1)
@@ -128,4 +129,5 @@
     throw Error("No more sub-TLV in log response");
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/logger-response.hpp b/core/logger-response.hpp
index d773ab2..2ba5491 100644
--- a/core/logger-response.hpp
+++ b/core/logger-response.hpp
@@ -26,7 +26,8 @@
 #include "util/non-negative-integer.hpp"
 #include <ndn-cxx/encoding/buffer.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class LoggerResponse
 {
@@ -93,6 +94,7 @@
   mutable Block m_wire;
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_LOGGER_RESPONSE_HPP
diff --git a/core/logger.cpp b/core/logger.cpp
index 983a44d..8349f7b 100644
--- a/core/logger.cpp
+++ b/core/logger.cpp
@@ -23,7 +23,8 @@
 #include "tlv.hpp"
 #include "conf/config-file.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 const int Logger::N_DATA_FETCHING_RETRIAL = 2;
 
@@ -302,4 +303,5 @@
 }
 
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/logger.hpp b/core/logger.hpp
index f685495..08b910e 100644
--- a/core/logger.hpp
+++ b/core/logger.hpp
@@ -28,11 +28,13 @@
 #include "policy-checker.hpp"
 #include "merkle-tree.hpp"
 #include "util/non-negative-integer.hpp"
+
 #include <ndn-cxx/face.hpp>
 #include <ndn-cxx/security/key-chain.hpp>
 #include <ndn-cxx/security/validator-config.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class Logger
 {
@@ -135,6 +137,7 @@
   PolicyChecker m_policyChecker;
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_LOGGER_HPP
diff --git a/core/merkle-tree.cpp b/core/merkle-tree.cpp
index 2219d2f..300456a 100644
--- a/core/merkle-tree.cpp
+++ b/core/merkle-tree.cpp
@@ -21,7 +21,8 @@
 
 #include "merkle-tree.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 MerkleTree::MerkleTree(Db& db)
   : m_db(db)
@@ -215,4 +216,5 @@
   m_pendingTrees[newSibling->getPeakIndex().level] = newSibling;
 }
 
-}// namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/merkle-tree.hpp b/core/merkle-tree.hpp
index f1baa46..c388fe9 100644
--- a/core/merkle-tree.hpp
+++ b/core/merkle-tree.hpp
@@ -27,7 +27,8 @@
 #include "sub-tree-binary.hpp"
 #include <vector>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class MerkleTree
 {
@@ -103,6 +104,7 @@
   std::map<size_t, shared_ptr<SubTreeBinary>> m_pendingTrees;
 };
 
-}// namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_MERKLE_TREE_HPP
diff --git a/core/node.cpp b/core/node.cpp
index d0882e4..74716e6 100644
--- a/core/node.cpp
+++ b/core/node.cpp
@@ -24,7 +24,8 @@
 #include <ndn-cxx/util/digest.hpp>
 #include <boost/lexical_cast.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 ndn::ConstBufferPtr Node::EMPTY_HASH;
 
@@ -121,4 +122,5 @@
   return EMPTY_HASH;
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/node.hpp b/core/node.hpp
index a9cb487..ef0db61 100644
--- a/core/node.hpp
+++ b/core/node.hpp
@@ -26,7 +26,8 @@
 #include "util/non-negative-integer.hpp"
 #include <ndn-cxx/encoding/buffer.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class Node
 {
@@ -119,6 +120,7 @@
 typedef shared_ptr<Node> NodePtr;
 typedef shared_ptr<const Node> ConstNodePtr;
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_NODE_HPP
diff --git a/core/policy-checker.cpp b/core/policy-checker.cpp
index 97464a1..34e2582 100644
--- a/core/policy-checker.cpp
+++ b/core/policy-checker.cpp
@@ -24,7 +24,8 @@
 #include <ndn-cxx/security/validator.hpp>
 #include <boost/algorithm/string.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 using ndn::time::system_clock;
 
@@ -55,8 +56,6 @@
 void
 PolicyChecker::onConfigRule(const conf::ConfigSection& section)
 {
-  using namespace nsl::conf;
-
   auto it = section.begin();
 
   // Get rule.id
@@ -82,7 +81,7 @@
     throw Error("Unrecognized <rule.for>: " + usage + " in rule: " + ruleId);
 
   // Get rule.filter(s)
-  std::vector<shared_ptr<Filter> > filters;
+  std::vector<shared_ptr<conf::Filter> > filters;
   for (; it != section.end(); it++) {
     if (!boost::iequals(it->first, "filter")) {
       if (boost::iequals(it->first, "checker"))
@@ -90,17 +89,17 @@
       throw Error("Expect <rule.filter> in rule: " + ruleId);
     }
 
-    filters.push_back(FilterFactory::create(it->second));
+    filters.push_back(conf::FilterFactory::create(it->second));
     continue;
   }
 
   // Get rule.checker(s)
-  std::vector<shared_ptr<Checker> > checkers;
+  std::vector<shared_ptr<conf::Checker> > checkers;
   for (; it != section.end(); it++) {
     if (!boost::iequals(it->first, "checker"))
       throw Error("Expect <rule.checker> in rule: " + ruleId);
 
-    checkers.push_back(CheckerFactory::create(it->second));
+    checkers.push_back(conf::CheckerFactory::create(it->second));
     continue;
   }
 
@@ -167,4 +166,5 @@
 }
 
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/policy-checker.hpp b/core/policy-checker.hpp
index 1194316..2f04788 100644
--- a/core/policy-checker.hpp
+++ b/core/policy-checker.hpp
@@ -30,7 +30,8 @@
 #include <ndn-cxx/security/identity-certificate.hpp>
 
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 class PolicyChecker
 {
@@ -71,6 +72,7 @@
   DataRuleList m_dataRules;
 };
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_POLICY_CHECKER_HPP
diff --git a/core/sub-tree-binary.cpp b/core/sub-tree-binary.cpp
index 26cef84..ad3b7a2 100644
--- a/core/sub-tree-binary.cpp
+++ b/core/sub-tree-binary.cpp
@@ -25,7 +25,8 @@
 #include <ndn-cxx/util/crypto.hpp>
 #include <ndn-cxx/security/digest-sha256.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 const time::milliseconds SubTreeBinary::INCOMPLETE_FRESHNESS_PERIOD(60000);
 const std::string SubTreeBinary::COMPONENT_COMPLETE("complete");
@@ -468,4 +469,5 @@
     updateParentNode(parentNode);
 }
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/core/sub-tree-binary.hpp b/core/sub-tree-binary.hpp
index ba52e1b..56fd66d 100644
--- a/core/sub-tree-binary.hpp
+++ b/core/sub-tree-binary.hpp
@@ -24,7 +24,8 @@
 
 #include "node.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 typedef std::function<void(const Node::Index&)> CompleteCallback;
 typedef std::function<void(const Node::Index&,
@@ -177,6 +178,7 @@
 typedef shared_ptr<SubTreeBinary> SubTreeBinaryPtr;
 typedef shared_ptr<const SubTreeBinary> ConstSubTreeBinaryPtr;
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_SUB_TREE_HPP
diff --git a/core/tlv.hpp b/core/tlv.hpp
index d36f772..eb66e53 100644
--- a/core/tlv.hpp
+++ b/core/tlv.hpp
@@ -22,7 +22,8 @@
 #ifndef NDN_DELOREAN_CORE_TLV_HPP
 #define NDN_DELOREAN_CORE_TLV_HPP
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tlv {
 
 /**
@@ -47,6 +48,7 @@
 };
 
 } // namespace tlv
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_CORE_TLV_HPP
diff --git a/core/util/non-negative-integer.hpp b/core/util/non-negative-integer.hpp
index 08afe34..5b034f7 100644
--- a/core/util/non-negative-integer.hpp
+++ b/core/util/non-negative-integer.hpp
@@ -22,10 +22,12 @@
 #ifndef NDN_DELOREAN_UTIL_NON_NEGATIVE_INTEGER_HPP
 #define NDN_DELOREAN_UTIL_NON_NEGATIVE_INTEGER_HPP
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 typedef uint64_t NonNegativeInteger;
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_UTIL_NON_NEGATIVE_INTEGER_HPP
diff --git a/core/util/timestamp.hpp b/core/util/timestamp.hpp
index a35a09d..cecc046 100644
--- a/core/util/timestamp.hpp
+++ b/core/util/timestamp.hpp
@@ -22,10 +22,12 @@
 #ifndef NDN_DELOREAN_UTIL_TIMESTAMP_HPP
 #define NDN_DELOREAN_UTIL_TIMESTAMP_HPP
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 
 typedef uint64_t Timestamp;
 
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_UTIL_TIMESTAMP_HPP
diff --git a/daemon/main.cpp b/daemon/main.cpp
index ee8c9fd..57ad8ba 100644
--- a/daemon/main.cpp
+++ b/daemon/main.cpp
@@ -19,6 +19,7 @@
  * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "common.hpp"
 #include "../core/logger.hpp"
 
 #include <boost/program_options/options_description.hpp>
@@ -26,7 +27,6 @@
 #include <boost/program_options/parsers.hpp>
 #include <boost/filesystem.hpp>
 
-
 int
 main(int argc, char** argv)
 {
@@ -62,11 +62,11 @@
   if (vm.count("config") == 0) {
 
     if (!getenv("HOME")) {
-      configFile = "/usr/local/etc/ndn/nsl.conf";
+      configFile = NDN_DELOREAN_DEFAULT_CONFIG_FILE;
     }
     else {
       configFile = getenv("HOME");
-      configFile += "/.ndn/nsl.conf";
+      configFile += "/.ndn/ndn-delorean.conf";
     }
 
     if (!fs::exists(fs::path(configFile))) {
@@ -77,7 +77,7 @@
 
   try {
     ndn::Face face;
-    nsl::Logger(face, configFile);
+    ndn::delorean::Logger(face, configFile);
     face.processEvents();
   }
   catch (std::runtime_error& e) {
diff --git a/tests/boost-multi-log-formatter.hpp b/tests/boost-multi-log-formatter.hpp
new file mode 100644
index 0000000..ae37416
--- /dev/null
+++ b/tests/boost-multi-log-formatter.hpp
@@ -0,0 +1,214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2015 Regents of the University of California.
+ *
+ * Based on work by Martin Ba (http://stackoverflow.com/a/26718189)
+ *
+ * This file is distributed under the Boost Software License, Version 1.0.
+ * (See http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
+#define NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 105900
+#include <boost/test/unit_test_parameters.hpp>
+#else
+#include <boost/test/detail/unit_test_parameters.hpp>
+#endif // BOOST_VERSION >= 105900
+
+#include <boost/test/unit_test_log_formatter.hpp>
+#include <boost/test/output/compiler_log_formatter.hpp>
+#include <boost/test/output/xml_log_formatter.hpp>
+
+namespace boost {
+namespace unit_test {
+namespace output {
+
+/**
+ * @brief Log formatter for Boost.Test that outputs the logging to multiple formatters
+ *
+ * The log formatter is designed to output to one or multiple formatters at the same time.  For
+ * example, one HRF formatter can output to the standard output, while XML formatter output to
+ * the file.
+ *
+ * Usage:
+ *
+ *     // Call in init_unit_test_suite: (this will override the --log_format parameter)
+ *     auto formatter = new boost::unit_test::output::multi_log_formatter; // same as already configured logger
+ *
+ *     // Prepare and add additional logger(s)
+ *     formatter.add(std::make_shared<boost::unit_test::output::xml_log_formatter>(),
+ *                   std::make_shared<std::ofstream>("out.xml"));
+ *
+ *      boost::unit_test::unit_test_log.set_formatter(formatter);
+ *
+ * @note Calling `boost::unit_test::unit_test_log.set_stream(...)` will change the stream for
+ *       the original logger.
+ */
+class multi_log_formatter : public unit_test_log_formatter
+{
+public:
+  /**
+   * @brief Create instance of the logger, based on the configured logger instance
+   */
+  multi_log_formatter()
+  {
+    auto format =
+#if BOOST_VERSION > 105900
+      runtime_config::get<output_format>(runtime_config::LOG_FORMAT);
+#else
+      runtime_config::log_format();
+#endif // BOOST_VERSION > 105900
+
+    switch (format) {
+      default:
+#if BOOST_VERSION >= 105900
+      case OF_CLF:
+#else
+      case CLF:
+#endif // BOOST_VERSION >= 105900
+        m_loggers.push_back({std::make_shared<compiler_log_formatter>(), nullptr});
+        break;
+#if BOOST_VERSION >= 105900
+      case OF_XML:
+#else
+      case XML:
+#endif // BOOST_VERSION >= 105900
+        m_loggers.push_back({std::make_shared<xml_log_formatter>(), nullptr});
+        break;
+    }
+  }
+
+  void
+  add(std::shared_ptr<unit_test_log_formatter> formatter, std::shared_ptr<std::ostream> os)
+  {
+    m_loggers.push_back({formatter, os});
+  }
+
+  // Formatter interface
+  void
+  log_start(std::ostream& os, counter_t test_cases_amount)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_start(l.os == nullptr ? os : *l.os, test_cases_amount);
+  }
+
+  void
+  log_finish(std::ostream& os)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_finish(l.os == nullptr ? os : *l.os);
+  }
+
+  void
+  log_build_info(std::ostream& os)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_build_info(l.os == nullptr ? os : *l.os);
+  }
+
+  void
+  test_unit_start(std::ostream& os, const test_unit& tu)
+  {
+    for (auto& l : m_loggers)
+      l.logger->test_unit_start(l.os == nullptr ? os : *l.os, tu);
+  }
+
+  void
+  test_unit_finish(std::ostream& os, const test_unit& tu, unsigned long elapsed)
+  {
+    for (auto& l : m_loggers)
+      l.logger->test_unit_finish(l.os == nullptr ? os : *l.os, tu, elapsed);
+  }
+
+  void
+  test_unit_skipped(std::ostream& os, const test_unit& tu)
+  {
+    for (auto& l : m_loggers)
+      l.logger->test_unit_skipped(l.os == nullptr ? os : *l.os, tu);
+  }
+
+#if BOOST_VERSION >= 105900
+  void
+  log_exception_start(std::ostream& os, const log_checkpoint_data& lcd, const execution_exception& ex)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_exception_start(l.os == nullptr ? os : *l.os, lcd, ex);
+  }
+
+  void
+  log_exception_finish(std::ostream& os)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_exception_finish(l.os == nullptr ? os : *l.os);
+  }
+#else
+  void
+  log_exception(std::ostream& os, const log_checkpoint_data& lcd, const execution_exception& ex)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_exception(l.os == nullptr ? os : *l.os, lcd, ex);
+  }
+#endif // BOOST_VERSION >= 105900
+
+  void
+  log_entry_start(std::ostream& os, const log_entry_data& entry_data, log_entry_types let)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_entry_start(l.os == nullptr ? os : *l.os, entry_data, let);
+  }
+
+  void
+  log_entry_value(std::ostream& os, const_string value)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_entry_value(l.os == nullptr ? os : *l.os, value);
+  }
+
+  void
+  log_entry_finish(std::ostream& os)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_entry_finish(l.os == nullptr ? os : *l.os);
+  }
+
+#if BOOST_VERSION >= 105900
+  void
+  entry_context_start(std::ostream& os, log_level level)
+  {
+    for (auto& l : m_loggers)
+      l.logger->entry_context_start(l.os == nullptr ? os : *l.os, level);
+  }
+
+  void
+  log_entry_context(std::ostream& os, const_string value)
+  {
+    for (auto& l : m_loggers)
+      l.logger->log_entry_context(l.os == nullptr ? os : *l.os, value);
+  }
+
+  void
+  entry_context_finish(std::ostream& os)
+  {
+    for (auto& l : m_loggers)
+      l.logger->entry_context_finish(l.os == nullptr ? os : *l.os);
+  }
+#endif // BOOST_VERSION >= 105900
+
+private:
+  struct LoggerInfo
+  {
+    std::shared_ptr<unit_test_log_formatter> logger;
+    std::shared_ptr<std::ostream> os;
+  };
+  std::vector<LoggerInfo> m_loggers;
+};
+
+} // namespace output
+} // namespace unit_test
+} // namespace boost
+
+#endif // NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
diff --git a/tests/core/auditor.t.cpp b/tests/core/auditor.t.cpp
index cf3eb02..aefb822 100644
--- a/tests/core/auditor.t.cpp
+++ b/tests/core/auditor.t.cpp
@@ -26,7 +26,8 @@
 #include <boost/mpl/list.hpp>
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestAuditor)
@@ -210,4 +211,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/config.t.cpp b/tests/core/config.t.cpp
index 2cf27cc..12cca26 100644
--- a/tests/core/config.t.cpp
+++ b/tests/core/config.t.cpp
@@ -26,7 +26,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestConfig)
@@ -109,4 +110,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/db-fixture.hpp b/tests/core/db-fixture.hpp
index 7ecd215..d91bf3b 100644
--- a/tests/core/db-fixture.hpp
+++ b/tests/core/db-fixture.hpp
@@ -25,7 +25,8 @@
 #include "db.hpp"
 #include <boost/filesystem.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class DbFixture
@@ -50,6 +51,7 @@
 };
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_TESTS_DB_FIXTURE_HPP
diff --git a/tests/core/db.t.cpp b/tests/core/db.t.cpp
index 207e565..28921b3 100644
--- a/tests/core/db.t.cpp
+++ b/tests/core/db.t.cpp
@@ -26,7 +26,8 @@
 #include <ndn-cxx/encoding/buffer-stream.hpp>
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_FIXTURE_TEST_SUITE(TestDb, DbFixture)
@@ -164,4 +165,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/identity-fixture.hpp b/tests/core/identity-fixture.hpp
index bb3dc7b..2edb693 100644
--- a/tests/core/identity-fixture.hpp
+++ b/tests/core/identity-fixture.hpp
@@ -28,7 +28,8 @@
 
 #include <boost/filesystem.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class IdentityFixture : public UnitTestTimeFixture
@@ -71,6 +72,7 @@
 };
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_TESTS_IDENTITY_FIXTURE_HPP
diff --git a/tests/core/leaf.t.cpp b/tests/core/leaf.t.cpp
index ea20985..29221a4 100644
--- a/tests/core/leaf.t.cpp
+++ b/tests/core/leaf.t.cpp
@@ -24,7 +24,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestLeaf)
@@ -155,4 +156,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/logger-response.t.cpp b/tests/core/logger-response.t.cpp
index 9a6f0c0..e352c57 100644
--- a/tests/core/logger-response.t.cpp
+++ b/tests/core/logger-response.t.cpp
@@ -24,7 +24,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestLoggerResponse)
@@ -100,4 +101,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/logger.t.cpp b/tests/core/logger.t.cpp
index 498d05a..cba3d2c 100644
--- a/tests/core/logger.t.cpp
+++ b/tests/core/logger.t.cpp
@@ -27,7 +27,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class LoggerFixture : public IdentityFixture
@@ -35,8 +36,8 @@
 {
 public:
   LoggerFixture()
-    : face1(ndn::util::makeDummyClientFace(io, {true, true}))
-    , face2(ndn::util::makeDummyClientFace(io, {true, true}))
+    : face1(io, {true, true})
+    , face2(io, {true, true})
     , readInterestOffset1(0)
     , readDataOffset1(0)
     , readInterestOffset2(0)
@@ -53,10 +54,10 @@
   {
     bool hasPassed = false;
 
-    checkFace(face1->sentInterests, readInterestOffset1, *face2, hasPassed);
-    checkFace(face1->sentDatas, readDataOffset1, *face2, hasPassed);
-    checkFace(face2->sentInterests, readInterestOffset2, *face1, hasPassed);
-    checkFace(face2->sentDatas, readDataOffset2, *face1, hasPassed);
+    checkFace(face1.sentInterests, readInterestOffset1, face2, hasPassed);
+    checkFace(face1.sentData, readDataOffset1, face2, hasPassed);
+    checkFace(face2.sentInterests, readInterestOffset2, face1, hasPassed);
+    checkFace(face2.sentData, readDataOffset2, face1, hasPassed);
 
     return hasPassed;
   }
@@ -78,10 +79,10 @@
   void
   clear()
   {
-    face1->sentDatas.clear();
-    face1->sentInterests.clear();
-    face2->sentDatas.clear();
-    face2->sentInterests.clear();
+    face1.sentData.clear();
+    face1.sentInterests.clear();
+    face2.sentData.clear();
+    face2.sentInterests.clear();
 
     readInterestOffset1 = 0;
     readDataOffset1 = 0;
@@ -90,8 +91,8 @@
   }
 
 public:
-  shared_ptr<ndn::util::DummyClientFace> face1;
-  shared_ptr<ndn::util::DummyClientFace> face2;
+  ndn::util::DummyClientFace face1;
+  ndn::util::DummyClientFace face2;
 
   size_t readInterestOffset1;
   size_t readDataOffset1;
@@ -197,7 +198,7 @@
   fs::path certPath = fs::path(TEST_LOGGER_PATH) / "trust-anchor.cert";
   ndn::io::save(*rootCert, certPath.string());
 
-  Logger logger(*face1, configPath.string());
+  Logger logger(face1, configPath.string());
 
   BOOST_CHECK_EQUAL(logger.getLoggerName(), Name("/test/logger"));
   BOOST_CHECK_EQUAL(logger.getTreePrefix(), Name("/test/logger/tree"));
@@ -214,26 +215,26 @@
   leafInterestName.appendNumber(0);
   auto leafInterest = make_shared<Interest>(leafInterestName);
 
-  face1->receive(*leafInterest);
+  face1.receive(*leafInterest);
   advanceClocks(time::milliseconds(2), 100);
 
-  BOOST_CHECK_EQUAL(face1->sentDatas.size(), 1);
-  BOOST_CHECK(leafInterestName.isPrefixOf(face1->sentDatas[0].getName()));
+  BOOST_CHECK_EQUAL(face1.sentData.size(), 1);
+  BOOST_CHECK(leafInterestName.isPrefixOf(face1.sentData[0].getName()));
 
-  face1->sentDatas.clear();
+  face1.sentData.clear();
 
   Name treeInterestName("/test/logger/tree");
   treeInterestName.appendNumber(0);
   treeInterestName.appendNumber(0);
   auto treeInterest = make_shared<Interest>(treeInterestName);
 
-  face1->receive(*treeInterest);
+  face1.receive(*treeInterest);
   advanceClocks(time::milliseconds(2), 100);
 
-  BOOST_CHECK_EQUAL(face1->sentDatas.size(), 1);
-  BOOST_CHECK(treeInterestName.isPrefixOf(face1->sentDatas[0].getName()));
+  BOOST_CHECK_EQUAL(face1.sentData.size(), 1);
+  BOOST_CHECK(treeInterestName.isPrefixOf(face1.sentData[0].getName()));
 
-  face1->sentDatas.clear();
+  face1.sentData.clear();
 
   Name tld("/ndn/tld");
   Name tldKeyName = m_keyChain.generateRsaKeyPair(tld);
@@ -246,8 +247,8 @@
   m_keyChain.signByIdentity(*tldCert, root);
   m_keyChain.addCertificate(*tldCert);
 
-  face2->setInterestFilter(tldCert->getName().getPrefix(-1),
-    [&] (const ndn::InterestFilter&, const Interest&) { face2->put(*tldCert); },
+  face2.setInterestFilter(tldCert->getName().getPrefix(-1),
+    [&] (const ndn::InterestFilter&, const Interest&) { face2.put(*tldCert); },
     ndn::RegisterPrefixSuccessCallback(),
     [] (const Name&, const std::string&) {});
   advanceClocks(time::milliseconds(2), 100);
@@ -259,7 +260,7 @@
   auto logInterest = make_shared<Interest>(logInterestName);
   m_keyChain.sign(*logInterest, tldCert->getName());
 
-  face1->receive(*logInterest);
+  face1.receive(*logInterest);
   do {
     advanceClocks(time::milliseconds(2), 100);
   } while (passPacket());
@@ -276,11 +277,11 @@
   leafInterestName2.appendNumber(1);
   auto leafInterest2 = make_shared<Interest>(leafInterestName2);
 
-  face1->receive(*leafInterest2);
+  face1.receive(*leafInterest2);
   advanceClocks(time::milliseconds(2), 100);
 
-  BOOST_CHECK_EQUAL(face1->sentDatas.size(), 1);
-  BOOST_CHECK(leafInterestName2.isPrefixOf(face1->sentDatas[0].getName()));
+  BOOST_CHECK_EQUAL(face1.sentData.size(), 1);
+  BOOST_CHECK(leafInterestName2.isPrefixOf(face1.sentData[0].getName()));
   clear();
 
 
@@ -290,19 +291,19 @@
   treeInterestName2.appendNumber(0);
   auto treeInterest2 = make_shared<Interest>(treeInterestName2);
 
-  face1->receive(*treeInterest2);
+  face1.receive(*treeInterest2);
   advanceClocks(time::milliseconds(2), 100);
 
-  BOOST_CHECK_EQUAL(face1->sentDatas.size(), 1);
-  BOOST_CHECK(treeInterestName2.isPrefixOf(face1->sentDatas[0].getName()));
+  BOOST_CHECK_EQUAL(face1.sentData.size(), 1);
+  BOOST_CHECK(treeInterestName2.isPrefixOf(face1.sentData[0].getName()));
   clear();
 
 
   auto data = make_shared<Data>(Name("/ndn/tld/data"));
   m_keyChain.sign(*data, tldCert->getName());
 
-  face2->setInterestFilter(data->getName(),
-    [&] (const ndn::InterestFilter&, const Interest&) { face2->put(*data); },
+  face2.setInterestFilter(data->getName(),
+    [&] (const ndn::InterestFilter&, const Interest&) { face2.put(*data); },
     ndn::RegisterPrefixSuccessCallback(),
     [] (const Name&, const std::string&) {});
   advanceClocks(time::milliseconds(2), 100);
@@ -314,7 +315,7 @@
   auto logInterest2 = make_shared<Interest>(logInterestName2);
   m_keyChain.sign(*logInterest2, tldCert->getName());
 
-  face1->receive(*logInterest2);
+  face1.receive(*logInterest2);
   do {
     advanceClocks(time::milliseconds(2), 100);
   } while (passPacket());
@@ -332,4 +333,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/merkle-tree.t.cpp b/tests/core/merkle-tree.t.cpp
index 6c076dd..7893df0 100644
--- a/tests/core/merkle-tree.t.cpp
+++ b/tests/core/merkle-tree.t.cpp
@@ -26,7 +26,8 @@
 #include <boost/mpl/list.hpp>
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_FIXTURE_TEST_SUITE(TestMerkleTree, DbFixture)
@@ -246,4 +247,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/node.t.cpp b/tests/core/node.t.cpp
index 6bd6d31..23542b2 100644
--- a/tests/core/node.t.cpp
+++ b/tests/core/node.t.cpp
@@ -25,7 +25,8 @@
 #include <ndn-cxx/encoding/buffer-stream.hpp>
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestNode)
@@ -124,4 +125,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/policy-checker.t.cpp b/tests/core/policy-checker.t.cpp
index 120311b..ed861aa 100644
--- a/tests/core/policy-checker.t.cpp
+++ b/tests/core/policy-checker.t.cpp
@@ -25,7 +25,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_FIXTURE_TEST_SUITE(TestPolicyChecker, IdentityFixture)
@@ -190,4 +191,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/sub-tree-binary.t.cpp b/tests/core/sub-tree-binary.t.cpp
index 757668f..c29f834 100644
--- a/tests/core/sub-tree-binary.t.cpp
+++ b/tests/core/sub-tree-binary.t.cpp
@@ -25,7 +25,8 @@
 #include <ndn-cxx/util/digest.hpp>
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class SubTreeBinaryTestFixture
@@ -689,4 +690,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/tree-generation-fixture.t.cpp b/tests/core/tree-generation-fixture.t.cpp
index eaf94e6..c7fa664 100644
--- a/tests/core/tree-generation-fixture.t.cpp
+++ b/tests/core/tree-generation-fixture.t.cpp
@@ -23,7 +23,8 @@
 
 #include "boost-test.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(TestTreeGenerator)
@@ -109,4 +110,5 @@
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/core/unit-test-time-fixture.hpp b/tests/core/unit-test-time-fixture.hpp
index 9442c2a..253e997 100644
--- a/tests/core/unit-test-time-fixture.hpp
+++ b/tests/core/unit-test-time-fixture.hpp
@@ -26,7 +26,8 @@
 
 #include <boost/asio.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class UnitTestTimeFixture
@@ -64,6 +65,7 @@
 };
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_TESTS_UNIT_TESTS_UNIT_TEST_TIME_FIXTURE_HPP
diff --git a/tests/global-configuration-fixture.cpp b/tests/global-configuration-fixture.cpp
new file mode 100644
index 0000000..2601b17
--- /dev/null
+++ b/tests/global-configuration-fixture.cpp
@@ -0,0 +1,78 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California
+ *
+ * This file is part of NDN DeLorean, An Authentication System for Data Archives in
+ * Named Data Networking.  See AUTHORS.md for complete list of NDN DeLorean authors
+ * and contributors.
+ *
+ * NDN DeLorean 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.
+ *
+ * NDN DeLorean 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 NDN
+ * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "test-common.hpp"
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+class GlobalConfigurationFixture : boost::noncopyable
+{
+public:
+  GlobalConfigurationFixture()
+  {
+    if (getenv("HOME") != nullptr) {
+      m_home = getenv("HOME");
+    }
+    if (getenv("NDN_CLIENT_PIB") != nullptr) {
+      m_pib = getenv("NDN_CLIENT_PIB");
+    }
+    if (getenv("NDN_CLIENT_TPM") != nullptr) {
+      m_tpm = getenv("NDN_CLIENT_TPM");
+    }
+
+    boost::filesystem::path dir(TEST_HOME_PATH);
+    dir /= "test-home";
+    setenv("HOME", dir.generic_string().c_str(), 1);
+
+    setenv("NDN_CLIENT_PIB", "pib-sqlite3", 1);
+    setenv("NDN_CLIENT_TPM", "tpm-file", 1);
+    boost::filesystem::create_directories(dir);
+  }
+
+  ~GlobalConfigurationFixture()
+  {
+    if (!m_home.empty()) {
+      setenv("HOME", m_home.c_str(), 1);
+    }
+    if (!m_pib.empty()) {
+      setenv("NDN_CLIENT_PIB", m_home.c_str(), 1);
+    }
+    if (!m_tpm.empty()) {
+      setenv("NDN_CLIENT_TPM", m_home.c_str(), 1);
+    }
+  }
+
+private:
+  std::string m_home;
+  std::string m_pib;
+  std::string m_tpm;
+};
+
+BOOST_GLOBAL_FIXTURE(GlobalConfigurationFixture)
+#if (BOOST_VERSION >= 105900)
+;
+#endif // BOOST_VERSION >= 105900
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/home-env-fixture.cpp b/tests/home-env-fixture.cpp
deleted file mode 100644
index fcfda06..0000000
--- a/tests/home-env-fixture.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017, Regents of the University of California
- *
- * This file is part of NDN DeLorean, An Authentication System for Data Archives in
- * Named Data Networking.  See AUTHORS.md for complete list of NDN DeLorean authors
- * and contributors.
- *
- * NDN DeLorean 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.
- *
- * NDN DeLorean 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 NDN
- * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "common.hpp"
-#include <boost/filesystem.hpp>
-
-#include "boost-test.hpp"
-
-namespace nsl {
-namespace tests {
-
-class HomeEnvFixture
-{
-public:
-  HomeEnvFixture()
-  {
-    // initialize KeyChain from test specific HOME: TEST_HOME_PATH
-    if (std::getenv("HOME"))
-      m_HOME = std::getenv("HOME");
-
-    setenv("HOME", "tests/test-home", 1);
-  }
-
-  ~HomeEnvFixture()
-  {
-    boost::filesystem::remove_all(boost::filesystem::path("/tmp/test/nsl"));
-
-    if (!m_HOME.empty())
-      setenv("HOME", m_HOME.c_str(), 1);
-    else
-      unsetenv("HOME");
-  }
-
-private:
-  std::string m_HOME;
-
-  Name m_newIdentity;
-};
-
-BOOST_GLOBAL_FIXTURE(HomeEnvFixture)
-
-} // namespace tests
-} // namespace nsl
diff --git a/tests/main.cpp b/tests/main.cpp
index 989aa93..3c980ed 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -19,7 +19,95 @@
  * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#define BOOST_TEST_MAIN 1
-#define BOOST_TEST_DYN_LINK 1
 
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_ALTERNATIVE_INIT_API
+#define BOOST_TEST_MODULE NDN DeLorean Unit Tests
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 106200
+// Boost.Test v3.3 (Boost 1.62) natively supports multi-logger output
 #include "boost-test.hpp"
+#else
+#define BOOST_TEST_NO_MAIN
+#include "boost-test.hpp"
+
+#include "boost-multi-log-formatter.hpp"
+
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/variables_map.hpp>
+#include <boost/program_options/parsers.hpp>
+
+#include <fstream>
+#include <iostream>
+
+static bool
+init_tests()
+{
+  init_unit_test();
+
+  namespace po = boost::program_options;
+  namespace ut = boost::unit_test;
+
+  po::options_description extraOptions;
+  std::string logger;
+  std::string outputFile = "-";
+  extraOptions.add_options()
+    ("log_format2", po::value<std::string>(&logger), "Type of second log formatter: HRF or XML")
+    ("log_sink2", po::value<std::string>(&outputFile)->default_value(outputFile), "Second log sink, - for stdout")
+    ;
+  po::variables_map vm;
+  try {
+    po::store(po::command_line_parser(ut::framework::master_test_suite().argc,
+                                      ut::framework::master_test_suite().argv)
+                .options(extraOptions)
+                .run(),
+              vm);
+    po::notify(vm);
+  }
+  catch (const std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << "\n"
+              << extraOptions << std::endl;
+    return false;
+  }
+
+  if (vm.count("log_format2") == 0) {
+    // second logger is not configured
+    return true;
+  }
+
+  std::shared_ptr<ut::unit_test_log_formatter> formatter;
+  if (logger == "XML") {
+    formatter = std::make_shared<ut::output::xml_log_formatter>();
+  }
+  else if (logger == "HRF") {
+    formatter = std::make_shared<ut::output::compiler_log_formatter>();
+  }
+  else {
+    std::cerr << "ERROR: only HRF or XML log formatter can be specified" << std::endl;
+    return false;
+  }
+
+  std::shared_ptr<std::ostream> output;
+  if (outputFile == "-") {
+    output = std::shared_ptr<std::ostream>(&std::cout, std::bind([]{}));
+  }
+  else {
+    output = std::make_shared<std::ofstream>(outputFile.c_str());
+  }
+
+  auto multiFormatter = new ut::output::multi_log_formatter;
+  multiFormatter->add(formatter, output);
+  ut::unit_test_log.set_formatter(multiFormatter);
+
+  return true;
+}
+
+int
+main(int argc, char* argv[])
+{
+  return ::boost::unit_test::unit_test_main(&init_tests, argc, argv);
+}
+
+#endif // BOOST_VERSION >= 106200
diff --git a/tests/test-common.cpp b/tests/test-common.cpp
new file mode 100644
index 0000000..13c05d3
--- /dev/null
+++ b/tests/test-common.cpp
@@ -0,0 +1,78 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California
+ *
+ * This file is part of NDN DeLorean, An Authentication System for Data Archives in
+ * Named Data Networking.  See AUTHORS.md for complete list of NDN DeLorean authors
+ * and contributors.
+ *
+ * NDN DeLorean 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.
+ *
+ * NDN DeLorean 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 NDN
+ * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "test-common.hpp"
+
+#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
+
+namespace ndn {
+namespace delorean {
+namespace tests {
+
+shared_ptr<Interest>
+makeInterest(const Name& name, uint32_t nonce)
+{
+  auto interest = make_shared<Interest>(name);
+  if (nonce != 0) {
+    interest->setNonce(nonce);
+  }
+  return interest;
+}
+
+shared_ptr<Data>
+makeData(const Name& name)
+{
+  auto data = make_shared<Data>(name);
+  return signData(data);
+}
+
+Data&
+signData(Data& data)
+{
+  ndn::SignatureSha256WithRsa fakeSignature;
+  fakeSignature.setValue(ndn::encoding::makeEmptyBlock(tlv::SignatureValue));
+  data.setSignature(fakeSignature);
+  data.wireEncode();
+
+  return data;
+}
+
+shared_ptr<Link>
+makeLink(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> delegations)
+{
+  auto link = make_shared<Link>(name, delegations);
+  signData(link);
+  return link;
+}
+
+lp::Nack
+makeNack(const Name& name, uint32_t nonce, lp::NackReason reason)
+{
+  Interest interest(name);
+  interest.setNonce(nonce);
+  lp::Nack nack(std::move(interest));
+  nack.setReason(reason);
+  return nack;
+}
+
+} // namespace tests
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/test-common.hpp b/tests/test-common.hpp
new file mode 100644
index 0000000..73fda1d
--- /dev/null
+++ b/tests/test-common.hpp
@@ -0,0 +1,122 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California
+ *
+ * This file is part of NDN DeLorean, An Authentication System for Data Archives in
+ * Named Data Networking.  See AUTHORS.md for complete list of NDN DeLorean authors
+ * and contributors.
+ *
+ * NDN DeLorean 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.
+ *
+ * NDN DeLorean 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 NDN
+ * DeLorean, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef NDN_DELOREAN_TESTS_TEST_COMMON_HPP
+#define NDN_DELOREAN_TESTS_TEST_COMMON_HPP
+
+#include "logger.hpp"
+
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/link.hpp>
+#include <ndn-cxx/lp/nack.hpp>
+#include <ndn-cxx/util/dummy-client-face.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
+
+#include <boost/version.hpp>
+#include <boost/asio.hpp>
+#include <boost/filesystem.hpp>
+
+#include <fstream>
+
+#include "boost-test.hpp"
+// #include "unit-test-common-fixtures.hpp"
+// #include "identity-management-fixture.hpp"
+
+namespace ndn {
+namespace delorean {
+namespace tests {
+
+/** \brief create an Interest
+ *  \param name Interest name
+ *  \param nonce if non-zero, set Nonce to this value
+ *               (useful for creating Nack with same Nonce)
+ */
+shared_ptr<Interest>
+makeInterest(const Name& name, uint32_t nonce = 0);
+
+/** \brief create a Data with fake signature
+ *  \note Data may be modified afterwards without losing the fake signature.
+ *        If a real signature is desired, sign again with KeyChain.
+ */
+shared_ptr<Data>
+makeData(const Name& name);
+
+/** \brief add a fake signature to Data
+ */
+Data&
+signData(Data& data);
+
+/** \brief add a fake signature to Data
+ */
+inline shared_ptr<Data>
+signData(shared_ptr<Data> data)
+{
+  signData(*data);
+  return data;
+}
+
+/** \brief create a Link object with fake signature
+ *  \note Link may be modified afterwards without losing the fake signature.
+ *        If a real signature is desired, sign again with KeyChain.
+ */
+shared_ptr<Link>
+makeLink(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> delegations);
+
+/** \brief create a Nack
+ *  \param name Interest name
+ *  \param nonce Interest nonce
+ *  \param reason Nack reason
+ */
+lp::Nack
+makeNack(const Name& name, uint32_t nonce, lp::NackReason reason);
+
+/** \brief replace a name component
+ *  \param[inout] name name
+ *  \param index name component index
+ *  \param a arguments to name::Component constructor
+ */
+template<typename...A>
+void
+setNameComponent(Name& name, ssize_t index, const A& ...a)
+{
+  Name name2 = name.getPrefix(index);
+  name2.append(name::Component(a...));
+  name2.append(name.getSubName(name2.size()));
+  name = name2;
+}
+
+template<typename Packet, typename...A>
+void
+setNameComponent(Packet& packet, ssize_t index, const A& ...a)
+{
+  Name name = packet.getName();
+  setNameComponent(name, index, a...);
+  packet.setName(name);
+}
+
+} // namespace tests
+} // namespace delorean
+} // namespace ndn
+
+#endif // NDN_DELOREAN_TESTS_TEST_COMMON_HPP
diff --git a/tests/tree-generator.cpp b/tests/tree-generator.cpp
index 2689340..cc6dfda 100644
--- a/tests/tree-generator.cpp
+++ b/tests/tree-generator.cpp
@@ -22,7 +22,8 @@
 #include "tree-generator.hpp"
 #include <ndn-cxx/util/digest.hpp>
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 const Name TreeGenerator::LOGGER_NAME("/logger/name");
@@ -113,4 +114,5 @@
 }
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
diff --git a/tests/tree-generator.hpp b/tests/tree-generator.hpp
index 4c35084..d39d0f1 100644
--- a/tests/tree-generator.hpp
+++ b/tests/tree-generator.hpp
@@ -24,7 +24,8 @@
 
 #include "sub-tree-binary.hpp"
 
-namespace nsl {
+namespace ndn {
+namespace delorean {
 namespace tests {
 
 class TreeGenerator
@@ -51,6 +52,7 @@
 };
 
 } // namespace tests
-} // namespace nsl
+} // namespace delorean
+} // namespace ndn
 
 #endif // NDN_DELOREAN_TESTS_TREE_GENERATOR_HPP