diff --git a/core/common.hpp b/core/common.hpp
index 2b031cc..fa035c6 100644
--- a/core/common.hpp
+++ b/core/common.hpp
@@ -26,6 +26,18 @@
 #ifndef NDN_TOOLS_CORE_COMMON_HPP
 #define NDN_TOOLS_CORE_COMMON_HPP
 
+#ifdef WITH_TESTS
+#define VIRTUAL_WITH_TESTS virtual
+#define PUBLIC_WITH_TESTS_ELSE_PROTECTED public
+#define PUBLIC_WITH_TESTS_ELSE_PRIVATE public
+#define PROTECTED_WITH_TESTS_ELSE_PRIVATE protected
+#else
+#define VIRTUAL_WITH_TESTS
+#define PUBLIC_WITH_TESTS_ELSE_PROTECTED protected
+#define PUBLIC_WITH_TESTS_ELSE_PRIVATE private
+#define PROTECTED_WITH_TESTS_ELSE_PRIVATE private
+#endif
+
 #include <cinttypes>
 #include <cstddef>
 
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..ddcd0c5
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,23 @@
+ndn-tool unit tests
+===================
+
+## Assumptions
+
+Unit tests for a tool `foo` should be placed in the folder `foo` and build script for the tool
+should define `foo-objects` that includes all object files for the tool, except object files
+defining main function.
+
+For example,
+
+    bld(features='cxx',
+        name='tool-subtool-objects',
+        source=bld.path.ant_glob('subtool/*.cpp', excl='subtool/main.cpp'),
+        use='core-objects')
+
+    bld(features='cxx cxxprogram',
+        target='../../bin/subtool',
+        source='subtool/main.cpp',
+        use='tool-subtool-objects')
+
+    bld(name='tool-objects',
+        use='tool-subtool-objects')
diff --git a/tests/boost-test.hpp b/tests/boost-test.hpp
new file mode 100644
index 0000000..cd4ccfe
--- /dev/null
+++ b/tests/boost-test.hpp
@@ -0,0 +1,37 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools 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-tools 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-tools, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDN_TOOLS_TESTS_BOOST_TEST_HPP
+#define NDN_TOOLS_TESTS_BOOST_TEST_HPP
+
+// suppress warnings from Boost.Test
+#pragma GCC system_header
+#pragma clang system_header
+
+#include <boost/concept_check.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/test/output_test_stream.hpp>
+
+#endif // NDN_TOOLS_TESTS_BOOST_TEST_HPP
diff --git a/tests/main.cpp b/tests/main.cpp
new file mode 100644
index 0000000..3a2a4fb
--- /dev/null
+++ b/tests/main.cpp
@@ -0,0 +1,29 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools 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-tools 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-tools, 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
+
+#include "boost-test.hpp"
diff --git a/tests/ping/client/statistics-collector.t.cpp b/tests/ping/client/statistics-collector.t.cpp
new file mode 100644
index 0000000..5dcf941
--- /dev/null
+++ b/tests/ping/client/statistics-collector.t.cpp
@@ -0,0 +1,148 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Arizona Board of Regents.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools 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-tools 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-tools, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "tools/ping/client/statistics-collector.hpp"
+#include <ndn-cxx/util/dummy-client-face.hpp>
+
+#include "tests/test-common.hpp"
+
+namespace ndn {
+namespace ping {
+namespace client {
+namespace tests {
+
+using namespace ndn::tests;
+
+class StatisticsCollectorFixture
+{
+protected:
+  StatisticsCollectorFixture()
+    : face(util::makeDummyClientFace())
+    , pingOptions(makeOptions())
+    , pingProgram(*face, pingOptions)
+    , sc(pingProgram, pingOptions)
+  {
+  }
+
+private:
+  static Options
+  makeOptions()
+  {
+    Options opt;
+    opt.prefix = "ndn:/ping-prefix";
+    opt.shouldAllowStaleData = false;
+    opt.shouldGenerateRandomSeq = false;
+    opt.shouldPrintTimestamp = false;
+    opt.nPings = 5;
+    opt.interval = time::milliseconds(100);
+    opt.timeout = time::milliseconds(2000);
+    opt.startSeq = 1;
+    return opt;
+  }
+
+protected:
+  shared_ptr<util::DummyClientFace> face;
+  Options pingOptions;
+  Ping pingProgram;
+  StatisticsCollector sc;
+};
+
+BOOST_FIXTURE_TEST_SUITE(PingClientStatisticsCollector, StatisticsCollectorFixture)
+
+BOOST_AUTO_TEST_CASE(Resp50msResp50ms)
+{
+  sc.recordResponse(time::milliseconds(50));
+
+  Statistics stats1 = sc.computeStatistics();
+  BOOST_CHECK_EQUAL(stats1.prefix, pingOptions.prefix);
+  BOOST_CHECK_EQUAL(stats1.nSent, 1);
+  BOOST_CHECK_EQUAL(stats1.nReceived, 1);
+  BOOST_CHECK_CLOSE(stats1.minRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats1.maxRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats1.packetLossRate, 0.0, 0.001);
+  BOOST_CHECK_CLOSE(stats1.sumRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats1.avgRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats1.stdDevRtt, 0.0, 0.001);
+
+  sc.recordResponse(time::milliseconds(50));
+
+  Statistics stats2 = sc.computeStatistics();
+  BOOST_CHECK_EQUAL(stats2.prefix, pingOptions.prefix);
+  BOOST_CHECK_EQUAL(stats2.nSent, 2);
+  BOOST_CHECK_EQUAL(stats2.nReceived, 2);
+  BOOST_CHECK_CLOSE(stats2.minRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats2.maxRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats2.packetLossRate, 0.0, 0.001);
+  BOOST_CHECK_CLOSE(stats2.sumRtt, 100.0, 0.001);
+  BOOST_CHECK_CLOSE(stats2.avgRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats2.stdDevRtt, 0.0, 0.001);
+}
+
+BOOST_AUTO_TEST_CASE(Resp50msResp100ms)
+{
+  sc.recordResponse(time::milliseconds(50));
+  sc.recordResponse(time::milliseconds(100));
+
+  Statistics stats = sc.computeStatistics();
+  BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
+  BOOST_CHECK_EQUAL(stats.nSent, 2);
+  BOOST_CHECK_EQUAL(stats.nReceived, 2);
+  BOOST_CHECK_CLOSE(stats.minRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.maxRtt, 100.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.packetLossRate, 0.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.sumRtt, 150.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.avgRtt, 75.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.stdDevRtt, 25.0, 0.001);
+}
+
+BOOST_AUTO_TEST_CASE(LossLoss)
+{
+  sc.recordTimeout();
+  sc.recordTimeout();
+
+  Statistics stats = sc.computeStatistics();
+  BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
+  BOOST_CHECK_EQUAL(stats.nSent, 2);
+  BOOST_CHECK_EQUAL(stats.nReceived, 0);
+  BOOST_CHECK_CLOSE(stats.packetLossRate, 1.0, 0.001);
+}
+
+BOOST_AUTO_TEST_CASE(Resp50msLoss)
+{
+  sc.recordResponse(time::milliseconds(50));
+  sc.recordTimeout();
+
+  Statistics stats = sc.computeStatistics();
+  BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
+  BOOST_CHECK_EQUAL(stats.nSent, 2);
+  BOOST_CHECK_EQUAL(stats.nReceived, 1);
+  BOOST_CHECK_CLOSE(stats.minRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.maxRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.packetLossRate, 0.5, 0.001);
+  BOOST_CHECK_CLOSE(stats.sumRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.avgRtt, 50.0, 0.001);
+  BOOST_CHECK_CLOSE(stats.stdDevRtt, 0.0, 0.001);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace client
+} // namespace ping
+} // namespace ndn
diff --git a/tests/test-case.t.cpp.sample b/tests/test-case.t.cpp.sample
new file mode 100644
index 0000000..27c6d8a
--- /dev/null
+++ b/tests/test-case.t.cpp.sample
@@ -0,0 +1,61 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Arizona Board of Regents.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools 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-tools 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-tools, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// #include "unit-under-test.hpp"
+// Unit being tested MUST be included first, to ensure header compiles on its own.
+// For further information about test naming conventions, see
+// http://redmine.named-data.net/projects/nfd/wiki/UnitTesting
+
+#include "tests/test-common.hpp"
+
+namespace ndn {
+namespace tool_name {
+namespace tests {
+// Unit tests SHOULD go inside ndn::tool_name::tests namespace.
+
+// Common fixtures in ndn::tests can be imported.
+using namespace ndn::tests;
+
+// See http://redmine.named-data.net/projects/nfd/wiki/UnitTesting on how to name a test suite.
+BOOST_AUTO_TEST_SUITE(TestSkeleton)
+
+BOOST_AUTO_TEST_CASE(Test1)
+{
+  int i = 0;
+
+  // For reference of available Boost.Test macros, see
+  // http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/testing-tools/reference.html
+
+  BOOST_REQUIRE_NO_THROW(i = 1);
+  BOOST_REQUIRE_EQUAL(i, 1);
+}
+
+// Use UnitTestTimeFixture to mock clocks.
+BOOST_FIXTURE_TEST_CASE(Test2, UnitTestTimeFixture)
+{
+  // this->advanceClocks increments mock clocks.
+  boost::asio::io_service io;
+  this->advanceClocks(io, time::milliseconds(500));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace tool_name
+} // namespace ndn
diff --git a/tests/test-common.hpp b/tests/test-common.hpp
new file mode 100644
index 0000000..eaee1c6
--- /dev/null
+++ b/tests/test-common.hpp
@@ -0,0 +1,146 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools 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-tools 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-tools, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDN_TOOLS_TESTS_TEST_COMMON_HPP
+#define NDN_TOOLS_TESTS_TEST_COMMON_HPP
+
+#include "boost-test.hpp"
+
+#include <ndn-cxx/util/time-unit-test-clock.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/signature.hpp>
+#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
+
+#include <boost/asio/io_service.hpp>
+
+namespace ndn {
+namespace tests {
+
+/** \brief a test fixture that overrides steady clock and system clock
+ */
+class UnitTestTimeFixture
+{
+protected:
+  UnitTestTimeFixture()
+    : steadyClock(make_shared<time::UnitTestSteadyClock>())
+    , systemClock(make_shared<time::UnitTestSystemClock>())
+  {
+    time::setCustomClocks(steadyClock, systemClock);
+  }
+
+  ~UnitTestTimeFixture()
+  {
+    time::setCustomClocks(nullptr, nullptr);
+  }
+
+  /** \brief advance steady and system clocks
+   *
+   *  Clocks are advanced in increments of \p tick for \p nTicks ticks.
+   *  After each tick, the supplied io_service is polled to process pending I/O events.
+   *
+   *  Exceptions thrown during I/O events are propagated to the caller.
+   *  Clock advancing would stop in case of an exception.
+   */
+  void
+  advanceClocks(boost::asio::io_service& io,
+                const time::nanoseconds& tick, size_t nTicks = 1)
+  {
+    BOOST_ASSERT(nTicks >= 0);
+
+    this->advanceClocks(io, tick, tick * nTicks);
+  }
+
+  /** \brief advance steady and system clocks
+   *
+   *  Clocks are advanced in increments of \p tick for \p total time.
+   *  The last increment might be shorter than \p tick.
+   *  After each tick, the supplied io_service is polled to process pending I/O events.
+   *
+   *  Exceptions thrown during I/O events are propagated to the caller.
+   *  Clock advancing would stop in case of an exception.
+   */
+  void
+  advanceClocks(boost::asio::io_service& io,
+                const time::nanoseconds& tick, const time::nanoseconds& total)
+  {
+    BOOST_ASSERT(tick > time::nanoseconds::zero());
+    BOOST_ASSERT(total >= time::nanoseconds::zero());
+
+    time::nanoseconds remaining = total;
+    while (remaining > time::nanoseconds::zero()) {
+      if (remaining >= tick) {
+        steadyClock->advance(tick);
+        systemClock->advance(tick);
+        remaining -= tick;
+      }
+      else {
+        steadyClock->advance(remaining);
+        systemClock->advance(remaining);
+        remaining = time::nanoseconds::zero();
+      }
+
+      if (io.stopped())
+        io.reset();
+      io.poll();
+    }
+  }
+
+protected:
+  shared_ptr<time::UnitTestSteadyClock> steadyClock;
+  shared_ptr<time::UnitTestSystemClock> systemClock;
+};
+
+inline shared_ptr<Interest>
+makeInterest(const Name& name)
+{
+  return make_shared<Interest>(name);
+}
+
+inline shared_ptr<Data>
+signData(const shared_ptr<Data>& data)
+{
+  ndn::SignatureSha256WithRsa fakeSignature;
+  fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue,
+                                        static_cast<const uint8_t*>(nullptr), 0));
+  data->setSignature(fakeSignature);
+  data->wireEncode();
+
+  return data;
+}
+
+inline shared_ptr<Data>
+makeData(const Name& name)
+{
+  shared_ptr<Data> data = make_shared<Data>(name);
+  return signData(data);
+}
+
+
+} // namespace tests
+} // namespace ndn
+
+#endif // NDN_TOOLS_TESTS_TEST_COMMON_HPP
diff --git a/tests/wscript b/tests/wscript
new file mode 100644
index 0000000..6066890
--- /dev/null
+++ b/tests/wscript
@@ -0,0 +1,15 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+top = '..'
+
+def build(bld):
+    if not bld.env['WITH_TESTS']:
+        return
+
+    tools = bld.path.ant_glob('*', dir=True, src=False)
+
+    bld(target='../unit-tests',
+        features='cxx cxxprogram',
+        source=bld.path.ant_glob('**/*.cpp'),
+        use=['core-objects'] + ['%s-objects' % tool for tool in tools],
+        headers='../common.hpp boost-test.hpp',
+        )
diff --git a/tools/dump/wscript b/tools/dump/wscript
index 28e58b6..32b3695 100644
--- a/tools/dump/wscript
+++ b/tools/dump/wscript
@@ -33,10 +33,15 @@
                    uselib_store='PCAP', mandatory=True)
 
 def build(bld):
-    bld.program(
-        features='cxx',
-        target='../../bin/ndndump',
-        source=bld.path.ant_glob(['*.cpp']),
+    bld(features='cxx',
+        name='dump-objects',
+        source=bld.path.ant_glob('*.cpp', excl='main.cpp'),
         includes='.',
+        export_includes='.',
         use='core-objects BOOST PCAP',
         )
+
+    bld(features='cxx cxxprogram',
+        target='../../bin/ndndump',
+        source='main.cpp',
+        use='dump-objects')
diff --git a/tools/ping/client/statistics-collector.hpp b/tools/ping/client/statistics-collector.hpp
index 685ff1f..76278db 100644
--- a/tools/ping/client/statistics-collector.hpp
+++ b/tools/ping/client/statistics-collector.hpp
@@ -64,6 +64,13 @@
   StatisticsCollector(Ping& ping, const Options& options);
 
   /**
+   * Returns ping statistics as structure
+   */
+  Statistics
+  computeStatistics();
+
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+  /**
    * Called on ping response received
    * @param rtt round trip time
    */
@@ -76,12 +83,6 @@
   void
   recordTimeout();
 
-  /**
-   * Returns ping statistics as structure
-   */
-  Statistics
-  computeStatistics();
-
 private:
   Ping& m_ping;
   const Options& m_options;
diff --git a/tools/ping/wscript b/tools/ping/wscript
index 575e395..3e6755d 100644
--- a/tools/ping/wscript
+++ b/tools/ping/wscript
@@ -2,16 +2,28 @@
 top = '../..'
 
 def build(bld):
-    bld.program(
-        features='cxx',
-        target='../../bin/ndnping',
-        source=bld.path.ant_glob('client/*.cpp'),
-        use='core-objects',
-        )
 
-    bld.program(
-        features='cxx',
+    bld(features='cxx',
+        name='ping-client-objects',
+        source=bld.path.ant_glob('client/*.cpp', excl='client/ndn-ping.cpp'),
+        use='core-objects')
+
+    bld(features='cxx cxxprogram',
+        target='../../bin/ndnping',
+        source='client/ndn-ping.cpp',
+        use='ping-client-objects')
+
+    bld(features='cxx',
+        name='ping-server-objects',
+        source=bld.path.ant_glob('server/*.cpp', excl='server/ndn-ping-server.cpp'),
+        use='core-objects')
+
+    bld(features='cxx cxxprogram',
         target='../../bin/ndnpingserver',
-        source=bld.path.ant_glob('server/*.cpp'),
-        use='core-objects',
-        )
+        source='server/ndn-ping-server.cpp',
+        use='ping-server-objects')
+
+    ## (for unit tests)
+
+    bld(name='ping-objects',
+        use='ping-client-objects ping-server-objects')
diff --git a/wscript b/wscript
index 0b5aee1..e7dd99b 100644
--- a/wscript
+++ b/wscript
@@ -7,6 +7,8 @@
 def options(opt):
     opt.load(['compiler_cxx', 'gnu_dirs'])
     opt.load(['default-compiler-flags', 'sphinx_build', 'boost'], tooldir=['.waf-tools'])
+    opt.add_option('--with-tests', action='store_true', default=False,
+                   dest='with_tests', help='''Build unit tests''')
 
 def configure(conf):
     conf.load(['compiler_cxx', 'gnu_dirs',
@@ -20,7 +22,12 @@
     conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
                    uselib_store='NDN_CXX', mandatory=True)
 
-    conf.check_boost(lib='system iostreams regex')
+    boost_libs = 'system iostreams regex'
+    if conf.options.with_tests:
+        conf.env['WITH_TESTS'] = 1
+        conf.define('WITH_TESTS', 1);
+        boost_libs += ' unit_test_framework'
+    conf.check_boost(lib=boost_libs)
 
     conf.recurse('tools')
 
@@ -32,9 +39,10 @@
         name='core-objects',
         features='cxx',
         source=bld.path.ant_glob(['core/*.cpp']),
-        use='NDN_CXX',
+        use='NDN_CXX BOOST',
         export_includes='.',
         )
 
     bld.recurse('tools')
+    bld.recurse('tests')
     bld.recurse('manpages')
