diff --git a/test/event-scheduler-tests.cc b/test/event-scheduler-tests.cc
deleted file mode 100644
index fab5b76..0000000
--- a/test/event-scheduler-tests.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "scheduler/scheduler-all.h"
-
-#include <boost/test/unit_test.hpp>
-#include <boost/make_shared.hpp>
-#include <map>
-#include <unistd.h>
-
-using namespace boost;
-using namespace std;
-
-BOOST_AUTO_TEST_SUITE(SchedulerTests)
-
-map<string, int> table;
-
-void func(string str)
-{
-  map<string, int>::iterator it = table.find(str);
-  if (it == table.end())
-  {
-    table.insert(make_pair(str, 1));
-  }
-  else
-  {
-    int count = it->second;
-    count++;
-    table.erase(it);
-    table.insert(make_pair(str, count));
-  }
-}
-
-bool
-matcher(const TaskPtr &task)
-{
-  return task->tag() == "period" || task->tag() == "world";
-}
-
-BOOST_AUTO_TEST_CASE(SchedulerTest)
-{
-  SchedulerPtr scheduler(new Scheduler());
-  IntervalGeneratorPtr generator(new SimpleIntervalGenerator(0.2));
-
-  string tag1 = "hello";
-  string tag2 = "world";
-  string tag3 = "period";
-
-  TaskPtr task1(new OneTimeTask(boost::bind(func, tag1), tag1, scheduler, 0.5));
-  TaskPtr task2(new OneTimeTask(boost::bind(func, tag2), tag2, scheduler, 0.5));
-  TaskPtr task3(new PeriodicTask(boost::bind(func, tag3), tag3, scheduler, generator));
-
-  scheduler->start();
-  scheduler->addTask(task1);
-  scheduler->addTask(task2);
-  scheduler->addTask(task3);
-  BOOST_CHECK_EQUAL(scheduler->size(), 3);
-  usleep(600000);
-  BOOST_CHECK_EQUAL(scheduler->size(), 1);
-  scheduler->addTask(task1);
-  BOOST_CHECK_EQUAL(scheduler->size(), 2);
-  usleep(600000);
-  scheduler->addTask(task1);
-  BOOST_CHECK_EQUAL(scheduler->size(), 2);
-  usleep(400000);
-  scheduler->deleteTask(task1->tag());
-  BOOST_CHECK_EQUAL(scheduler->size(), 1);
-  usleep(200000);
-
-  scheduler->addTask(task1);
-  scheduler->addTask(task2);
-  BOOST_CHECK_EQUAL(scheduler->size(), 3);
-  usleep(100000);
-  scheduler->deleteTask(bind(matcher, _1));
-  BOOST_CHECK_EQUAL(scheduler->size(), 1);
-  usleep(1000000);
-
-  BOOST_CHECK_EQUAL(scheduler->size(), 0);
-  scheduler->addTask(task1);
-  usleep(400000);
-  BOOST_CHECK_EQUAL(scheduler->size(), 1);
-  scheduler->rescheduleTask(task1);
-  usleep(400000);
-  BOOST_CHECK_EQUAL(scheduler->size(), 1);
-  usleep(110000);
-  BOOST_CHECK_EQUAL(scheduler->size(), 0);
-
-
-  int hello = 0, world = 0, period = 0;
-
-  map<string, int>::iterator it;
-  it = table.find(tag1);
-  if (it != table.end())
-  {
-    hello = it->second;
-  }
-  it = table.find(tag2);
-  if (it != table.end())
-  {
-    world = it->second;
-  }
-  it = table.find(tag3);
-  if (it != table.end())
-  {
-    period = it->second;
-  }
-
-  // added five times, canceled once before invoking callback
-  BOOST_CHECK_EQUAL(hello, 4);
-  // added two times, canceled once by matcher before invoking callback
-  BOOST_CHECK_EQUAL(world, 1);
-  // invoked every 0.2 seconds before deleted by matcher
-  BOOST_CHECK_EQUAL(period, static_cast<int>((0.6 + 0.6 + 0.4 + 0.2 + 0.1) / 0.2));
-
-  scheduler->shutdown();
-}
-
-void reschedule();
-SchedulerPtr schd0(new Scheduler());
-int resCount;
-TaskPtr task0(new PeriodicTask(boost::bind(reschedule), "testtest", schd0, boost::make_shared<SimpleIntervalGenerator>(0.5)));
-void reschedule()
-{
-  schd0->rescheduleTask(task0);
-  resCount++;
-}
-
-BOOST_AUTO_TEST_CASE(RescheduleTest)
-{
-  resCount = 0;
-  schd0->start();
-  schd0->addTask(task0);
-  usleep(5100000);
-  BOOST_CHECK_EQUAL(resCount, 10);
-  schd0->shutdown();
-}
-
-BOOST_AUTO_TEST_CASE(GeneratorTest)
-{
-  double interval = 10;
-  double percent = 0.5;
-  int times = 10000;
-  IntervalGeneratorPtr generator(new RandomIntervalGenerator(interval, percent));
-  double sum = 0.0;
-  double min = 2 * interval;
-  double max = -1;
-  for (int i = 0; i < times; i++)
-  {
-    double next = generator->nextInterval();
-    sum += next;
-    if (next > max)
-    {
-      max = next;
-    }
-    if (next < min)
-    {
-      min = next;
-    }
-  }
-
-  BOOST_CHECK( abs(1.0 - (sum / static_cast<double>(times)) / interval) < 0.05);
-  BOOST_CHECK( min > interval * (1 - percent / 2.0));
-  BOOST_CHECK( max < interval * (1 + percent / 2.0));
-  BOOST_CHECK( abs(1.0 - ((max - min) / interval) / percent) < 0.05);
-
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/exclude-tests.cc b/test/exclude-tests.cc
deleted file mode 100644
index 882f5a6..0000000
--- a/test/exclude-tests.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-cpp/fields/exclude.h"
-#include "ndn-cpp/error.h"
-
-#include <boost/test/unit_test.hpp>
-
-#include <boost/lexical_cast.hpp>
-
-using namespace ndn;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(ExcludeTests)
-
-BOOST_AUTO_TEST_CASE (Basic)
-{
-  Exclude e;
-  e.excludeOne (string ("b"));
-  BOOST_CHECK_EQUAL (e.size (), 1);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "b ");
-
-  e.excludeOne (string ("d"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "b d ");
-
-  e.excludeOne (string ("a"));
-  BOOST_CHECK_EQUAL (e.size (), 3);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "a b d ");
-
-  e.excludeOne (string ("aa"));
-  BOOST_CHECK_EQUAL (e.size (), 4);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "a b d aa ");
-
-  e.excludeOne (string ("cc"));
-  BOOST_CHECK_EQUAL (e.size (), 5);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "a b d aa cc ");
-
-  e.excludeOne (string ("c"));
-  BOOST_CHECK_EQUAL (e.size (), 6);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "a b c d aa cc ");
-}
-
-BOOST_AUTO_TEST_CASE (Ranges)
-{
-// example: ANY /b /d ANY /f
-
-  Exclude e;
-  e.excludeOne (string ("b0"));
-  BOOST_CHECK_EQUAL (e.size (), 1);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), "b0 ");
-
-  e.excludeRange (name::Component (), string ("b1"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> b1 ");
-
-  e.excludeRange (name::Component (), string ("c0"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> c0 ");
-
-  e.excludeRange (string ("a0"), string ("c0"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> c0 ");
-
-  e.excludeRange (string ("d0"), string ("e0"));
-  BOOST_CHECK_EQUAL (e.size (), 4);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> c0 d0 ----> e0 ");
-
-  e.excludeRange (string ("c1"), string ("d1"));
-  BOOST_CHECK_EQUAL (e.size (), 4);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> c0 c1 ----> e0 ");
-
-  e.excludeRange (string ("a1"), string ("d1"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> e0 ");
-
-  e.excludeBefore (string ("e2"));
-  BOOST_CHECK_EQUAL (e.size (), 2);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> e2 ");
-
-  e.excludeAfter (string ("f0"));
-  BOOST_CHECK_EQUAL (e.size (), 3);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> e2 f0 ----> ");
-
-  e.excludeAfter (string ("e5"));
-  BOOST_CHECK_EQUAL (e.size (), 3);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> e2 e5 ----> ");
-
-  e.excludeAfter (string ("b2"));
-  BOOST_CHECK_EQUAL (e.size (), 1);
-  BOOST_CHECK_EQUAL (lexical_cast<string> (e), " ----> ");
-
-  BOOST_REQUIRE_THROW (e.excludeRange (string ("d0"), string ("a0")), error::Exclude);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/executor-tests.cc b/test/executor-tests.cc
deleted file mode 100644
index 273f0c2..0000000
--- a/test/executor-tests.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <boost/test/unit_test.hpp>
-#include "executor/executor.h"
-
-#include "logging.h"
-
-INIT_LOGGER ("Test.Executor");
-
-using namespace boost;
-using namespace std;
-
-void timeConsumingJob ()
-{
-  _LOG_DEBUG ("Start sleep");
-  sleep(1);
-  _LOG_DEBUG ("Finish sleep");
-}
-
-BOOST_AUTO_TEST_CASE(TestExecutor)
-{
-  INIT_LOGGERS ();
-
-  {
-    Executor executor (3);
-    executor.start ();
-    Executor::Job job = bind(timeConsumingJob);
-
-    executor.execute(job);
-    executor.execute(job);
-
-    usleep(2000);
-    // both jobs should have been taken care of
-    BOOST_CHECK_EQUAL(executor.jobQueueSize(), 0);
-
-    usleep(500000);
-
-    // add four jobs while only one thread is idle
-    executor.execute(job);
-    executor.execute(job);
-    executor.execute(job);
-    executor.execute(job);
-
-    usleep(1000);
-    // three jobs should remain in queue
-    BOOST_CHECK_EQUAL(executor.jobQueueSize(), 3);
-
-    usleep(500000);
-    // two threads should have finished and
-    // take care of two queued jobs
-    BOOST_CHECK_EQUAL(executor.jobQueueSize(), 1);
-
-    // all jobs should have been fetched
-    usleep(501000);
-    BOOST_CHECK_EQUAL(executor.jobQueueSize(), 0);
-
-    executor.shutdown ();
-  } //separate scope to ensure that destructor is called
-
-
-  sleep(1);
-}
diff --git a/test/interest-tests.cc b/test/interest-tests.cc
deleted file mode 100644
index 7e56fd1..0000000
--- a/test/interest-tests.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-cpp/wire/ccnb.h"
-#include "ndn-cpp/interest.h"
-
-#include <unistd.h>
-#include <fstream>
-
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/test/unit_test.hpp>
-#include <boost/make_shared.hpp>
-
-#include "logging.h"
-
-using namespace ndn;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(InterestTests)
-
-static const string Interest1 ("\x01\xD2\xF2\x00\x05\x9A\x8E\x32\x00\x05\xA2\x8E\x32\x00\x05\xAA\x8E\x31\x00\x02"
-                               "\xFA\x8E\x34\x00\x02\xD2\x8E\x30\x00\x03\x82\x95\xA0\x00\x00\x00",
-                               36);
-
-static const string Interest2 ("\x01\xD2\xF2\x00\x05\x9A\x8E\x32\x00\x05\xA2\x8E\x32\x00\x03\x82\x95\xA0\x00\x00"
-                               "\x00",
-                               21);
-
-static const string Interest3 ("\x01\xD2\xF2\x00\x05\x9A\x8E\x32\x00\x05\xA2\x8E\x32\x00\x02\xDA\xFA\xA5\x61\x6C" \
-                               "\x65\x78\x00\xFA\xC5\x7A\x68\x65\x6E\x6B\x61\x69\x30\x00\xEA\x00\xFA\xC5\x7A\x68" \
-                               "\x65\x6E\x6B\x61\x69\x31\x00\xFA\x01\x8D\x6C\x6F\x6F\x6F\x6F\x6F\x6F\x6F\x6F\x6F" \
-                               "\x6F\x6F\x6F\x6F\x6F\x6E\x67\x00\xEA\x00\x00\x05\xAA\x8E\x31\x00\x02\xFA\x8E\x34" \
-                               "\x00\x02\xD2\x8E\x30\x00\x03\x82\x95\xA0\x00\x00\x00", 93);
-
-BOOST_AUTO_TEST_CASE (Basic)
-{
-  INIT_LOGGERS ();
-  
-  Interest i;
-  i.setName (Name ("/test"));
-  i.setMinSuffixComponents (2);
-  i.setMaxSuffixComponents (2);
-  i.setInterestLifetime (posix_time::seconds (10));
-  i.setScope (Interest::SCOPE_LOCAL_CCND);
-  i.setAnswerOriginKind (Interest::AOK_STALE);
-  i.setChildSelector (Interest::CHILD_RIGHT);
-  // i.setPublisherPublicKeyDigest (?);
-
-  ostringstream os;
-  wire::Ccnb::appendInterest (os, i);
-  string Interest0 = os.str ();
-  BOOST_CHECK_EQUAL_COLLECTIONS (Interest0.begin (), Interest0.end (),
-                                 Interest1.begin (), Interest1.end ());
-
-  i.getExclude ().excludeOne (name::Component ("alex"));
-  i.getExclude ().excludeRange (name::Component ("zhenkai0"), name::Component("zhenkai1"));
-  i.getExclude ().excludeAfter (name::Component ("loooooooooooooong"));
-
-  BOOST_CHECK_EQUAL (boost::lexical_cast<string> (i.getExclude ()), "alex zhenkai0 ----> zhenkai1 loooooooooooooong ----> ");
-
-  os.str (""); os.clear ();
-  wire::Ccnb::appendInterest (os, i);
-  Interest0 = os.str ();
-  BOOST_CHECK_EQUAL_COLLECTIONS (Interest0.begin (), Interest0.end (),
-                                 Interest3.begin (), Interest3.end ());
-}
-
-// BOOST_AUTO_TEST_CASE (Charbuf)
-// {
-//   INIT_LOGGERS ();
-
-//   Interest i;
-//   i.setName (Name ("/test"));
-//   i.setMinSuffixComponents (2);
-//   i.setMaxSuffixComponents (2);
-//   i.setInterestLifetime (posix_time::seconds (10));
-
-//   charbuf_stream stream;
-//   wire::Ccnb::appendInterest (stream, i);
-
-//   BOOST_CHECK_EQUAL_COLLECTIONS (reinterpret_cast<char*> (stream.buf ().getBuf ()->buf),
-//                                  reinterpret_cast<char*> (stream.buf ().getBuf ()->buf+stream.buf ().getBuf ()->length),
-//                                  Interest2.begin (), Interest2.end ());
-  
-// }
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/name-tests.cc b/test/name-tests.cc
deleted file mode 100644
index 1431f79..0000000
--- a/test/name-tests.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include <sstream>
-#include "ndn-cpp/fields/name.h"
-#include "ndn-cpp/fields/name-component.h"
-#include "ndn-cpp/error.h"
-#include "ndn-cpp/wire/ccnb.h"
-
-#define BOOST_TEST_MAIN 1
-
-#include <boost/test/unit_test.hpp>
-
-using namespace ndn;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(NameTests)
-
-BOOST_AUTO_TEST_CASE (Component)
-{
-  name::Component x;
-  BOOST_CHECK_EQUAL (x.size (), 0);
-
-  x = name::Component ("test");
-  BOOST_CHECK_EQUAL (x.size (), 4);
-
-  x = name::Component ("%21test");
-  BOOST_CHECK_EQUAL (x.size (), 5);
-
-  BOOST_CHECK_EQUAL (x.toUri (), "!test");
-
-  x = name::Component ("%20test");
-  BOOST_CHECK_EQUAL (x.size (), 5);
-
-  BOOST_CHECK_EQUAL (x.toUri (), "%20test");
-}
-
-BOOST_AUTO_TEST_CASE (Basic)
-{
-  Name empty = Name ();
-  Name root = Name ("/");
-  BOOST_CHECK_EQUAL (empty, root);
-  BOOST_CHECK_EQUAL (empty, Name ("/"));
-  BOOST_CHECK_EQUAL (root.size(), 0);
-
-  empty.append ("hello");
-  empty.append ("world");
-  BOOST_CHECK_EQUAL (empty.size(), 2);
-  BOOST_CHECK_EQUAL (empty.toUri(), "/hello/world");
-  empty = empty + root;
-  BOOST_CHECK_EQUAL (empty.toUri(), "/hello/world");
-  BOOST_CHECK_EQUAL (empty.get (0).toUri (), "hello");
-  BOOST_CHECK_EQUAL (empty.getSubName(1, 1), Name("/world"));
-  Name name("/hello/world");
-  BOOST_CHECK_EQUAL (empty, name);
-  BOOST_CHECK_EQUAL (name, Name("/hello") + Name("/world"));
-
-  name.appendSeqNum (1);
-  name.appendSeqNum (255);
-  name.appendSeqNum (256);
-  name.appendSeqNum (1234567890);
-
-  BOOST_CHECK_EQUAL (name.toUri (), "/hello/world/%00%01/%00%FF/%00%01%00/%00I%96%02%D2");
-
-  BOOST_CHECK_EQUAL (name.get (5).toSeqNum (), 1234567890);
-  BOOST_CHECK_EQUAL (name.get (4).toSeqNum (), 256);
-  BOOST_CHECK_EQUAL (name.get (3).toSeqNum (), 255);
-  BOOST_CHECK_EQUAL (name.get (2).toSeqNum (), 1);
-
-  BOOST_CHECK_EQUAL (name.get (-1).toUri (), "%00I%96%02%D2");
-
-  BOOST_CHECK_EQUAL (Name ("/%00").get (0).toSeqNum (), 0);
-
-  const char tmp [] = {0, 1, 2, 3, 0x50};
-  BOOST_CHECK_EQUAL (Name ().append (tmp, sizeof(tmp)).toUri (), "/%00%01%02%03P");
-
-  string entree("entr\u00E9e");
-  BOOST_CHECK_EQUAL (Name ().append (entree.c_str(), entree.size()).toUri (), "/entr%C3%A9e");
-  Name entreeName("/entr%C3%A9e");
-  BOOST_CHECK_EQUAL_COLLECTIONS (entreeName.get(0).begin(), entreeName.get(0).end(), entree.begin(), entree.end() );
-
-  Name appendName ("/hello/you");
-  appendName.append (Name ("/hello/you/too"));
-  BOOST_CHECK_EQUAL (appendName.toUri (), "/hello/you/hello/you/too");
-
-  Name appendSelf ("/hello/you");
-  appendSelf.append (appendSelf);
-  BOOST_CHECK_EQUAL (appendSelf.toUri (), "/hello/you/hello/you");
-
-  Name withVersion ("/hello.txt/%FD%95-%25U1%DE%04/%00%01");
-  BOOST_REQUIRE_NO_THROW (withVersion.get (1).toVersion ());
-  BOOST_CHECK_EQUAL (withVersion.get (1).toVersion (), 1370203370106261);
-  
-  BOOST_CHECK_EQUAL (Name("/!").toUri(), "/%21");
-}
-
-BOOST_AUTO_TEST_CASE (Advanced)
-{
-  BOOST_REQUIRE_THROW (Name (""),       error::Name);
-  BOOST_REQUIRE_THROW (Name ("//"), error::Name);
-  BOOST_REQUIRE_THROW (Name ("ndn://"), error::Name);
-  BOOST_REQUIRE_THROW (Name ("bla"),    error::Name);
-  BOOST_REQUIRE_THROW (Name ("bla/"),   error::Name);
-  BOOST_REQUIRE_THROW (Name ("http:/test"), error::Name);
-
-  BOOST_CHECK_EQUAL (Name ("ndn:///").toUri (), "/");
-  BOOST_CHECK_EQUAL (Name ("ccnx:///").toUri (), "/");
-  BOOST_CHECK_EQUAL (Name ("/").toUri (), "/");
-  BOOST_CHECK_EQUAL (Name ("///").toUri (), "/");
-  BOOST_CHECK_EQUAL (Name ("////////////////////////////////////////////////").toUri (), "/");
-  BOOST_CHECK_EQUAL (Name ("ndn://bla:random@something-else:0000/actual/name").toUri (), "/actual/name");
-  BOOST_CHECK_EQUAL (Name ("/slash/").toUri (), "/slash");
-  
-  BOOST_CHECK_EQUAL (Name ().append (".", 1).toUri (), "/...");
-  BOOST_CHECK_EQUAL (Name ("/.").get(0).size(), 0);
-  BOOST_CHECK_EQUAL (Name ("/..").get(0).size(), 0);
-  BOOST_CHECK_EQUAL (Name ("/...").get(0).size(), 0);
-  BOOST_CHECK_EQUAL (Name ("/....").get(0).size(), 1);
-  
-  BOOST_CHECK_EQUAL (Name ().append ("", 0).toUri (), "/...");
-  const char tmp [] = {'.'};
-  BOOST_CHECK_EQUAL (Name ().append (tmp, sizeof(tmp)).toUri (), "/....");
-}
-
-BOOST_AUTO_TEST_CASE (Ordering)
-{
-  // check "canonical" ordering
-  BOOST_CHECK_EQUAL (Name ("/test"), Name ("/test"));
-  BOOST_CHECK_GE (Name ("/test"), Name ("/aaaa"));
-  BOOST_CHECK_GT (Name ("/test"), Name ("/aaaa"));
-  BOOST_CHECK_GT (Name ("/test/test/test"), Name ("/test/test"));
-  BOOST_CHECK_GE (Name ("/test/test/test"), Name ("/test/test"));
-  BOOST_CHECK_GE (Name ("/test/test/test"), Name ("/test/test/test"));
-
-  BOOST_CHECK_LE (Name ("/test"), Name ("/aaaaa"));
-  BOOST_CHECK_LT (Name ("/test"), Name ("/aaaaa"));
-  BOOST_CHECK_LT (Name ("/test/test"), Name ("/test/test/test"));
-  BOOST_CHECK_LE (Name ("/test/test"), Name ("/test/test/test"));
-  BOOST_CHECK_LE (Name ("/test/test/test"), Name ("/test/test/test"));
-}
-
-BOOST_AUTO_TEST_CASE (Encoding)
-{
-  std::stringbuf buffer;
-  std::ostream output (&buffer);
-
-  Name root = Name ("/");
-  wire::Ccnb::appendName(output, root);
-  BOOST_CHECK_EQUAL (buffer.str().size(), 2);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/security-tests.cc b/test/security-tests.cc
deleted file mode 100644
index ec8415c..0000000
--- a/test/security-tests.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-// #include "platforms/osx/keychain-osx.h"
-#include "ndn-cpp/error.h"
-
-#include <boost/test/unit_test.hpp>
-
-#include <fstream>
-
-using namespace ndn;
-using namespace std;
-using namespace boost;
-
-BOOST_AUTO_TEST_SUITE(SecurityTests)
-
-BOOST_AUTO_TEST_CASE (Basic)
-{
-  // Ptr<Keychain> keychain;
-  // BOOST_CHECK_NO_THROW (keychain = Ptr<keychain::OSX>::Create ());
-
-  // Name keyName ("/my/private/key1");
-  // keychain->generateKeyPair (keyName);
-  // // keychain->deleteKeyPair (keyName);
-
-  // Ptr<Blob> key = keychain->getPublicKey (keyName);
-  // ofstream f ("out.pub");
-  // f.write (key->buf (), key->size ());
-}
-
-BOOST_AUTO_TEST_SUITE_END()
