diff --git a/tests/global-configuration-fixture.cpp b/tests/global-configuration-fixture.cpp
index 25dd100..a8ba286 100644
--- a/tests/global-configuration-fixture.cpp
+++ b/tests/global-configuration-fixture.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2016, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -28,8 +28,6 @@
 public:
   GlobalConfigurationFixture()
   {
-    log::init("unit-tests.log4cxx");
-
     if (getenv("HOME") != nullptr) {
       m_home = getenv("HOME");
     }
diff --git a/tests/unit/clients/iterative-query-controller.cpp b/tests/unit/clients/iterative-query-controller.cpp
index 307ce8b..65ab32b 100644
--- a/tests/unit/clients/iterative-query-controller.cpp
+++ b/tests/unit/clients/iterative-query-controller.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -27,8 +27,6 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("IterativeQueryControllerTest")
-
 class QueryControllerFixture : public DbTestData
 {
 public:
@@ -87,7 +85,7 @@
   time::milliseconds lifetime(4000);
 
   bool hasDataBack = false;
-  auto ctr = make_shared<ndns::IterativeQueryController>(
+  auto ctr = std::make_shared<ndns::IterativeQueryController>(
     dstLabel, rrType, lifetime,
     [&hasDataBack] (const Data&, const Response&) {
       hasDataBack = true;
diff --git a/tests/unit/daemon/db-mgr.cpp b/tests/unit/daemon/db-mgr.cpp
index 4f730b9..ffa38b8 100644
--- a/tests/unit/daemon/db-mgr.cpp
+++ b/tests/unit/daemon/db-mgr.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -26,7 +26,7 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("DbMgrTest")
+NDNS_LOG_INIT(DbMgrTest);
 
 BOOST_AUTO_TEST_SUITE(DbMgr)
 
diff --git a/tests/unit/daemon/name-server.cpp b/tests/unit/daemon/name-server.cpp
index a8dbd3b..dae6685 100644
--- a/tests/unit/daemon/name-server.cpp
+++ b/tests/unit/daemon/name-server.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -31,7 +31,7 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("NameServerTest")
+NDNS_LOG_INIT(NameServerTest);
 
 class NameServerFixture : public DbTestData
 {
diff --git a/tests/unit/daemon/rrset-factory.cpp b/tests/unit/daemon/rrset-factory.cpp
index 625679e..39c9286 100644
--- a/tests/unit/daemon/rrset-factory.cpp
+++ b/tests/unit/daemon/rrset-factory.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -29,7 +29,7 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("RrsetFactoryTest")
+NDNS_LOG_INIT(RrsetFactoryTest);
 
 class RrsetFactoryFixture : public IdentityManagementFixture
 {
diff --git a/tests/unit/database-test-data.cpp b/tests/unit/database-test-data.cpp
index 11d2ff8..2aef965 100644
--- a/tests/unit/database-test-data.cpp
+++ b/tests/unit/database-test-data.cpp
@@ -27,7 +27,7 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("TestFakeData")
+NDNS_LOG_INIT(TestFakeData);
 
 const boost::filesystem::path DbTestData::TEST_DATABASE = TEST_CONFIG_PATH "/" "test-ndns.db";
 const Name DbTestData::TEST_IDENTITY_NAME("/test19");
diff --git a/tests/unit/logger.cpp b/tests/unit/logger.cpp
deleted file mode 100644
index e7ba277..0000000
--- a/tests/unit/logger.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2016, Regents of the University of California.
- *
- * This file is part of NDNS (Named Data Networking Domain Name Service).
- * See AUTHORS.md for complete list of NDNS authors and contributors.
- *
- * NDNS 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.
- *
- * NDNS 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
- * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "logger.hpp"
-
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/classification.hpp>
-
-#include "test-common.hpp"
-
-namespace ndn {
-namespace ndns {
-namespace tests {
-
-BOOST_AUTO_TEST_SUITE(Logger)
-
-class Fixture
-{
-public:
-  Fixture()
-    : m_logConfigFilename(boost::filesystem::unique_path().native())
-    , m_logFilename(boost::filesystem::unique_path().native())
-  {
-  }
-
-  ~Fixture()
-  {
-    boost::filesystem::remove(boost::filesystem::path(getLogConfigFilename()));
-    boost::filesystem::remove(boost::filesystem::path(getLogFilename()));
-
-    log::init("unit-tests.log4cxx");
-  }
-
-  const std::string&
-  getLogConfigFilename()
-  {
-    return m_logConfigFilename;
-  }
-
-  const std::string&
-  getLogFilename()
-  {
-    return m_logFilename;
-  }
-
-  void
-  verifyOutput(const std::string expected[], size_t nExpected)
-  {
-    std::ifstream is(getLogFilename().c_str());
-    std::string buffer((std::istreambuf_iterator<char>(is)),
-                       (std::istreambuf_iterator<char>()));
-
-    std::vector<std::string> components;
-    boost::split(components, buffer, boost::is_any_of(" ,\n"));
-
-    // expected + number of timestamps (one per log statement) + trailing newline of last statement
-    BOOST_REQUIRE_EQUAL(components.size(), nExpected);
-
-    for (size_t i = 0; i < nExpected; ++i) {
-      if (expected[i] == "")
-        continue;
-
-      BOOST_CHECK_EQUAL(components[i], expected[i]);
-    }
-  }
-
-private:
-  std::string m_logConfigFilename;
-  std::string m_logFilename;
-};
-
-BOOST_FIXTURE_TEST_CASE(AllLevels, Fixture)
-{
-  {
-    std::ofstream of(getLogConfigFilename().c_str());
-    of << "log4j.rootLogger=TRACE, FILE\n"
-       << "log4j.appender.FILE=org.apache.log4j.FileAppender\n"
-       << "log4j.appender.FILE.layout=org.apache.log4j.PatternLayout\n"
-       << "log4j.appender.FILE.File=" << getLogFilename() << "\n"
-       << "log4j.appender.FILE.ImmediateFlush=true\n"
-       << "log4j.appender.FILE.layout.ConversionPattern=%d{HH:mm:ss} %p %c{1} - %m%n\n";
-  }
-
-  log::init(getLogConfigFilename());
-
-  NDNS_LOG_INIT("DefaultConfig");
-
-  NDNS_LOG_TRACE("trace-message-JHGFDSR^1");
-  NDNS_LOG_DEBUG("debug-message-IGg2474fdksd-fo-" << 15 << 16 << 17);
-  NDNS_LOG_INFO("info-message-Jjxjshj13");
-  NDNS_LOG_WARN("warning-message-XXXhdhd11" << 1 <<"x");
-  NDNS_LOG_ERROR("error-message-!#$&^%$#@");
-  NDNS_LOG_FATAL("fatal-message-JJSjaamcng");
-
-  const std::string EXPECTED[] =
-    {
-      "", "TRACE", "DefaultConfig", "-", "trace-message-JHGFDSR^1",
-      "", "DEBUG", "DefaultConfig", "-", "debug-message-IGg2474fdksd-fo-151617",
-      "", "INFO",  "DefaultConfig", "-", "info-message-Jjxjshj13",
-      "", "WARN",  "DefaultConfig", "-", "warning-message-XXXhdhd111x",
-      "", "ERROR", "DefaultConfig", "-", "error-message-!#$&^%$#@",
-      "", "FATAL", "DefaultConfig", "-", "fatal-message-JJSjaamcng",
-      "",
-    };
-
-  verifyOutput(EXPECTED, sizeof(EXPECTED) / sizeof(std::string));
-}
-
-BOOST_FIXTURE_TEST_CASE(UpToInfo, Fixture)
-{
-  {
-    std::ofstream of(getLogConfigFilename().c_str());
-    of << "log4j.rootLogger=INFO, FILE\n"
-       << "log4j.appender.FILE=org.apache.log4j.FileAppender\n"
-       << "log4j.appender.FILE.layout=org.apache.log4j.PatternLayout\n"
-       << "log4j.appender.FILE.File=" << getLogFilename() << "\n"
-       << "log4j.appender.FILE.ImmediateFlush=true\n"
-       << "log4j.appender.FILE.layout.ConversionPattern=%d{HH:mm:ss} %p %c{1} - %m%n\n";
-  }
-
-  log::init(getLogConfigFilename());
-
-  NDNS_LOG_INIT("DefaultConfig");
-
-  NDNS_LOG_TRACE("trace-message-JHGFDSR^1");
-  NDNS_LOG_DEBUG("debug-message-IGg2474fdksd-fo-" << 15 << 16 << 17);
-  NDNS_LOG_INFO("info-message-Jjxjshj13");
-  NDNS_LOG_WARN("warning-message-XXXhdhd11" << 1 <<"x");
-  NDNS_LOG_ERROR("error-message-!#$&^%$#@");
-  NDNS_LOG_FATAL("fatal-message-JJSjaamcng");
-
-  const std::string EXPECTED[] =
-    {
-      "", "INFO",  "DefaultConfig", "-", "info-message-Jjxjshj13",
-      "", "WARN",  "DefaultConfig", "-", "warning-message-XXXhdhd111x",
-      "", "ERROR", "DefaultConfig", "-", "error-message-!#$&^%$#@",
-      "", "FATAL", "DefaultConfig", "-", "fatal-message-JJSjaamcng",
-      "",
-    };
-
-  verifyOutput(EXPECTED, sizeof(EXPECTED) / sizeof(std::string));
-}
-
-BOOST_FIXTURE_TEST_CASE(OnlySelectedModule, Fixture)
-{
-  {
-    std::ofstream of(getLogConfigFilename().c_str());
-    of << "log4j.rootLogger=OFF, FILE\n"
-       << "log4j.appender.FILE=org.apache.log4j.FileAppender\n"
-       << "log4j.appender.FILE.layout=org.apache.log4j.PatternLayout\n"
-       << "log4j.appender.FILE.File=" << getLogFilename() << "\n"
-       << "log4j.appender.FILE.ImmediateFlush=true\n"
-       << "log4j.appender.FILE.layout.ConversionPattern=%d{HH:mm:ss} %p %c - %m%n\n"
-       << "log4j.logger.SelectedModule=TRACE\n"
-       << "log4j.logger.SelectedModule.Submodule=FATAL\n";
-  }
-
-  log::init(getLogConfigFilename());
-
-  {
-    NDNS_LOG_INIT("DefaultConfig");
-
-    NDNS_LOG_TRACE("trace-message-JHGFDSR^1");
-    NDNS_LOG_DEBUG("debug-message-IGg2474fdksd-fo-" << 15 << 16 << 17);
-    NDNS_LOG_INFO("info-message-Jjxjshj13");
-    NDNS_LOG_WARN("warning-message-XXXhdhd11" << 1 <<"x");
-    NDNS_LOG_ERROR("error-message-!#$&^%$#@");
-    NDNS_LOG_FATAL("fatal-message-JJSjaamcng");
-  }
-
-  {
-    NDNS_LOG_INIT("SelectedModule");
-
-    NDNS_LOG_TRACE("trace-message-JHGFDSR^1");
-    NDNS_LOG_DEBUG("debug-message-IGg2474fdksd-fo-" << 15 << 16 << 17);
-    NDNS_LOG_INFO("info-message-Jjxjshj13");
-    NDNS_LOG_WARN("warning-message-XXXhdhd11" << 1 <<"x");
-    NDNS_LOG_ERROR("error-message-!#$&^%$#@");
-    NDNS_LOG_FATAL("fatal-message-JJSjaamcng");
-  }
-
-  {
-    NDNS_LOG_INIT("SelectedModule.Submodule");
-
-    NDNS_LOG_TRACE("trace-message-JHGFDSR^1");
-    NDNS_LOG_DEBUG("debug-message-IGg2474fdksd-fo-" << 15 << 16 << 17);
-    NDNS_LOG_INFO("info-message-Jjxjshj13");
-    NDNS_LOG_WARN("warning-message-XXXhdhd11" << 1 <<"x");
-    NDNS_LOG_ERROR("error-message-!#$&^%$#@");
-    NDNS_LOG_FATAL("fatal-message-JJSjaamcng");
-  }
-
-  const std::string EXPECTED[] =
-    {
-      "", "TRACE", "SelectedModule", "-", "trace-message-JHGFDSR^1",
-      "", "DEBUG", "SelectedModule", "-", "debug-message-IGg2474fdksd-fo-151617",
-      "", "INFO",  "SelectedModule", "-", "info-message-Jjxjshj13",
-      "", "WARN",  "SelectedModule", "-", "warning-message-XXXhdhd111x",
-      "", "ERROR", "SelectedModule", "-", "error-message-!#$&^%$#@",
-      "", "FATAL", "SelectedModule", "-", "fatal-message-JJSjaamcng",
-      "", "FATAL", "SelectedModule.Submodule", "-", "fatal-message-JJSjaamcng",
-      "",
-    };
-
-  verifyOutput(EXPECTED, sizeof(EXPECTED) / sizeof(std::string));
-}
-
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace tests
-} // namespace ndns
-} // namespace ndn
diff --git a/tests/unit/validator/certificate-fetcher-ndns-app-cert.cpp b/tests/unit/validator/certificate-fetcher-ndns-app-cert.cpp
index 2efe67c..3f236aa 100644
--- a/tests/unit/validator/certificate-fetcher-ndns-app-cert.cpp
+++ b/tests/unit/validator/certificate-fetcher-ndns-app-cert.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -36,8 +36,6 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("AppCertFetcher")
-
 BOOST_AUTO_TEST_SUITE(AppCertFetcher)
 
 unique_ptr<security::v2::Validator>
diff --git a/tests/unit/validator/validator.cpp b/tests/unit/validator/validator.cpp
index 3434916..21f6d27 100644
--- a/tests/unit/validator/validator.cpp
+++ b/tests/unit/validator/validator.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 NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -32,8 +32,6 @@
 namespace ndns {
 namespace tests {
 
-NDNS_LOG_INIT("ValidatorTest")
-
 BOOST_AUTO_TEST_SUITE(Validator)
 
 class ValidatorTestFixture : public DbTestData
diff --git a/tests/wscript b/tests/wscript
index a44fede..3b48571 100644
--- a/tests/wscript
+++ b/tests/wscript
@@ -7,41 +7,31 @@
 def build(bld):
     if not bld.env['WITH_TESTS']:
         return
-    dst = bld.bldnode.make_node("conf-test/anchors")
-    dst.mkdir()
+
+    tmp_folder = bld.bldnode.make_node('tmp-files')
+    config_path = 'TEST_CONFIG_PATH="%s"' % tmp_folder
+    tmp_folder.make_node('anchors').mkdir()
 
     bld(features="subst",
         name='test-validator-conf',
         source='../validator.conf.sample.in',
-        target='../conf-test/validator.conf',
+        target=tmp_folder.make_node('validator.conf'),
         use='validator-sample',
         ANCHORPATH='\"anchors/root.cert\"',
         RELATION='is-prefix-of',
     )
 
-    bld(features="subst",
-        name='test-logger-conf',
-        source='../log4cxx.properties.sample.in',
-        target='../conf-test/log4cxx.properties.sample',
-        is_copy=True,
-        use='log4cxx-sample',
-    )
-
-    bld(features='cxx',
-        name='unit-tests-main',
+    bld.objects(
         target='unit-tests-main',
         source='main.cpp',
-        defines=['BOOST_TEST_MODULE=NDNS Unit Tests',
-                 'TEST_CONFIG_PATH=\"%s/conf-test\"' %(bld.bldnode)],
-        use='ndns-objects BOOST'
-    )
+        defines=['BOOST_TEST_MODULE=NDNS Unit Tests', config_path],
+        use='ndns-objects')
 
-    unit_tests = bld.program(
+    bld.program(
         target='../unit-tests',
-        features='cxx cxxprogram',
-        source=bld.path.ant_glob(['**/*.cpp'], excl=['main.cpp']),
-        use='ndns-objects unit-tests-main BOOST',
+        name='unit-tests',
+        source=bld.path.ant_glob('**/*.cpp', excl=['main.cpp']),
+        use='ndns-objects unit-tests-main',
         includes='../src .',
         install_path=None,
-        defines='TEST_CONFIG_PATH=\"%s/conf-test\"' %(bld.bldnode)
-    )
+        defines=[config_path])
