diff --git a/src/fetch-manager.cpp b/src/fetch-manager.cpp
index 15ecb32..d8dd6a6 100644
--- a/src/fetch-manager.cpp
+++ b/src/fetch-manager.cpp
@@ -19,21 +19,16 @@
  */
 
 #include "fetch-manager.hpp"
-#include <boost/lexical_cast.hpp>
-#include <boost/make_shared.hpp>
-#include <boost/ref.hpp>
-#include <boost/throw_exception.hpp>
+#include "core/logging.hpp"
 
-#include "logging.hpp"
-#include "simple-interval-generator.hpp"
+#include <ndn-cxx/face.hpp>
+
+namespace ndn {
+namespace chronoshare {
 
 _LOG_INIT(FetchManager);
 
-using namespace boost;
-using namespace std;
-using namespace Ndnx;
-
-//The disposer object function
+// The disposer object function
 struct fetcher_disposer
 {
   void
@@ -43,54 +38,42 @@
   }
 };
 
-static const string SCHEDULE_FETCHES_TAG = "ScheduleFetches";
-
-FetchManager::FetchManager(Ccnx::CcnxWrapperPtr ccnx,
-                           const Mapping& mapping,
-                           const Name& broadcastForwardingHint,
+FetchManager::FetchManager(Face& face, const Mapping& mapping, const Name& broadcastForwardingHint,
                            uint32_t parallelFetches, // = 3
                            const SegmentCallback& defaultSegmentCallback,
-                           const FinishCallback& defaultFinishCallback,
-                           const FetchTaskDbPtr& taskDb)
-  : m_ccnx(ccnx)
+                           const FinishCallback& defaultFinishCallback, const FetchTaskDbPtr& taskDb)
+  : m_face(face)
   , m_mapping(mapping)
   , m_maxParallelFetches(parallelFetches)
   , m_currentParallelFetches(0)
-  , m_scheduler(new Scheduler)
-  , m_executor(new Executor(1))
+  , m_scheduler(m_face.getIoService())
+  , m_scheduledFetchesEvent(m_scheduler)
   , m_defaultSegmentCallback(defaultSegmentCallback)
   , m_defaultFinishCallback(defaultFinishCallback)
   , m_taskDb(taskDb)
   , m_broadcastHint(broadcastForwardingHint)
+  , m_ioService(m_face.getIoService())
 {
-  m_scheduler->start();
-  m_executor->start();
+  // no need to check to often. if needed, will be rescheduled
+  m_scheduledFetchesEvent =
+    m_scheduler.scheduleEvent(time::seconds(300), bind(&FetchManager::ScheduleFetches, this));
 
-  m_scheduleFetchesTask =
-    Scheduler::schedulePeriodicTask(m_scheduler,
-                                    make_shared<SimpleIntervalGenerator>(
-                                      300), // no need to check to often. if needed, will be rescheduled
-                                    bind(&FetchManager::ScheduleFetches, this),
-                                    SCHEDULE_FETCHES_TAG);
   // resume un-finished fetches if there is any
   if (m_taskDb) {
-    m_taskDb->foreachTask(bind(&FetchManager::Enqueue, this, _1, _2, _3, _4, _5));
+    m_taskDb->foreachTask(
+      [this](const Name& deviceName, const Name& baseName, uint64_t minSeqNo, uint64_t maxSeqNo,
+             int priority) { this->Enqueue(deviceName, baseName, minSeqNo, maxSeqNo, priority); });
   }
 }
 
 FetchManager::~FetchManager()
 {
-  m_scheduler->shutdown();
-  m_executor->shutdown();
-
-  m_ccnx.reset();
-
   m_fetchList.clear_and_dispose(fetcher_disposer());
 }
 
 // Enqueue using default callbacks
 void
-FetchManager::Enqueue(const Ccnx::Name& deviceName, const Ccnx::Name& baseName, uint64_t minSeqNo,
+FetchManager::Enqueue(const Name& deviceName, const Name& baseName, uint64_t minSeqNo,
                       uint64_t maxSeqNo, int priority)
 {
   Enqueue(deviceName, baseName, m_defaultSegmentCallback, m_defaultFinishCallback, minSeqNo,
@@ -98,7 +81,7 @@
 }
 
 void
-FetchManager::Enqueue(const Ccnx::Name& deviceName, const Ccnx::Name& baseName,
+FetchManager::Enqueue(const Name& deviceName, const Name& baseName,
                       const SegmentCallback& segmentCallback, const FinishCallback& finishCallback,
                       uint64_t minSeqNo, uint64_t maxSeqNo, int priority /*PRIORITY_NORMAL*/)
 {
@@ -115,14 +98,14 @@
     m_taskDb->addTask(deviceName, baseName, minSeqNo, maxSeqNo, priority);
   }
 
-  unique_lock<mutex> lock(m_parellelFetchMutex);
+  std::unique_lock<std::mutex> lock(m_parellelFetchMutex);
 
   _LOG_TRACE("++++ Create fetcher: " << baseName);
   Fetcher* fetcher =
-    new Fetcher(m_ccnx, m_executor, segmentCallback, finishCallback,
+    new Fetcher(m_face, segmentCallback, finishCallback,
                 bind(&FetchManager::DidFetchComplete, this, _1, _2, _3),
                 bind(&FetchManager::DidNoDataTimeout, this, _1), deviceName, baseName, minSeqNo,
-                maxSeqNo, boost::posix_time::seconds(30), forwardingHint);
+                maxSeqNo, time::seconds(30), forwardingHint);
 
   switch (priority) {
     case PRIORITY_HIGH:
@@ -138,19 +121,17 @@
   }
 
   _LOG_DEBUG("++++ Reschedule fetcher task");
-  m_scheduler->rescheduleTaskAt(m_scheduleFetchesTask, 0);
-  // ScheduleFetches (); // will start a fetch if m_currentParallelFetches is less than max, otherwise does nothing
+  m_scheduledFetchesEvent =
+    m_scheduler.scheduleEvent(time::seconds(0), bind(&FetchManager::ScheduleFetches, this));
 }
 
 void
 FetchManager::ScheduleFetches()
 {
-  unique_lock<mutex> lock(m_parellelFetchMutex);
+  std::unique_lock<std::mutex> lock(m_parellelFetchMutex);
 
-  boost::posix_time::ptime currentTime =
-    date_time::second_clock<boost::posix_time::ptime>::universal_time();
-  boost::posix_time::ptime nextSheduleCheck =
-    currentTime + posix_time::seconds(300); // no reason to have anything, but just in case
+  auto currentTime = time::steady_clock::now();
+  auto nextSheduleCheck = currentTime + time::seconds(300); // no reason to have anything, but just in case
 
   for (FetchList::iterator item = m_fetchList.begin();
        m_currentParallelFetches < m_maxParallelFetches && item != m_fetchList.end();
@@ -166,8 +147,9 @@
     }
 
     if (currentTime < item->GetNextScheduledRetry()) {
-      if (item->GetNextScheduledRetry() < nextSheduleCheck)
+      if (item->GetNextScheduledRetry() < nextSheduleCheck) {
         nextSheduleCheck = item->GetNextScheduledRetry();
+      }
 
       _LOG_DEBUG("Item is delayed");
       continue;
@@ -180,8 +162,8 @@
     item->RestartPipeline();
   }
 
-  m_scheduler->rescheduleTaskAt(m_scheduleFetchesTask,
-                                (nextSheduleCheck - currentTime).total_seconds());
+  m_scheduledFetchesEvent = m_scheduler.scheduleEvent(nextSheduleCheck - currentTime,
+                                                      bind(&FetchManager::ScheduleFetches, this));
 }
 
 void
@@ -191,7 +173,7 @@
                                     << fetcher.GetForwardingHint());
 
   {
-    unique_lock<mutex> lock(m_parellelFetchMutex);
+    std::unique_lock<std::mutex> lock(m_parellelFetchMutex);
     m_currentParallelFetches--;
     // no need to do anything with the m_fetchList
   }
@@ -220,27 +202,26 @@
     fetcher.SetForwardingHint(m_broadcastHint);
   }
 
-  double delay = fetcher.GetRetryPause();
-  if (delay < 1) // first time
+  time::seconds delay = fetcher.GetRetryPause();
+  if (delay < time::seconds(1)) // first time
   {
-    delay = 1;
+    delay = time::seconds(1);
   }
   else {
-    delay = std::min(2 * delay, 300.0); // 5 minutes max
+    delay = std::min(2 * delay, time::seconds(300)); // 5 minutes max
   }
 
   fetcher.SetRetryPause(delay);
-  fetcher.SetNextScheduledRetry(date_time::second_clock<boost::posix_time::ptime>::universal_time() +
-                                posix_time::seconds(delay));
+  fetcher.SetNextScheduledRetry(time::steady_clock::now() + time::seconds(delay));
 
-  m_scheduler->rescheduleTaskAt(m_scheduleFetchesTask, 0);
+  m_scheduledFetchesEvent = m_scheduler.scheduleEvent(time::seconds(0), bind(&FetchManager::ScheduleFetches, this));
 }
 
 void
 FetchManager::DidFetchComplete(Fetcher& fetcher, const Name& deviceName, const Name& baseName)
 {
   {
-    unique_lock<mutex> lock(m_parellelFetchMutex);
+    std::unique_lock<std::mutex> lock(m_parellelFetchMutex);
     m_currentParallelFetches--;
 
     if (m_taskDb) {
@@ -249,17 +230,17 @@
   }
 
   // like TCP timed-wait
-  m_scheduler->scheduleOneTimeTask(m_scheduler, 10,
-                                   boost::bind(&FetchManager::TimedWait, this, ref(fetcher)),
-                                   boost::lexical_cast<string>(baseName));
-
-  m_scheduler->rescheduleTaskAt(m_scheduleFetchesTask, 0);
+  m_scheduler.scheduleEvent(time::seconds(10), bind(&FetchManager::TimedWait, this, ref(fetcher)));
+  m_scheduledFetchesEvent = m_scheduler.scheduleEvent(time::seconds(0), bind(&FetchManager::ScheduleFetches, this));
 }
 
 void
 FetchManager::TimedWait(Fetcher& fetcher)
 {
-  unique_lock<mutex> lock(m_parellelFetchMutex);
+  std::unique_lock<std::mutex> lock(m_parellelFetchMutex);
   _LOG_TRACE("+++++ removing fetcher: " << fetcher.GetName());
   m_fetchList.erase_and_dispose(FetchList::s_iterator_to(fetcher), fetcher_disposer());
 }
+
+} // namespace chronoshare
+} // namespace ndn
diff --git a/src/fetch-manager.hpp b/src/fetch-manager.hpp
index 8372e9d..5dae0ff 100644
--- a/src/fetch-manager.hpp
+++ b/src/fetch-manager.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016, Regents of the University of California.
+ * Copyright (c) 2013-2017, Regents of the University of California.
  *
  * This file is part of ChronoShare, a decentralized file sharing application over NDN.
  *
@@ -21,31 +21,38 @@
 #ifndef FETCH_MANAGER_H
 #define FETCH_MANAGER_H
 
-#include "ccnx-wrapper.h"
-#include "executor.h"
-#include "fetch-task-db.h"
-#include "scheduler.h"
-#include <boost/exception/all.hpp>
-#include <boost/function.hpp>
-#include <boost/shared_ptr.hpp>
-#include <list>
-#include <stdint.h>
-#include <string>
+#include "fetch-task-db.hpp"
+#include "fetcher.hpp"
+#include "core/chronoshare-common.hpp"
 
-#include "fetcher.h"
+#include <ndn-cxx/util/scheduler-scoped-event-id.hpp>
+#include <ndn-cxx/util/scheduler.hpp>
+
+#include <list>
+
+namespace ndn {
+namespace chronoshare {
 
 class FetchManager
 {
 public:
+  class Error : public std::runtime_error
+  {
+  public:
+    explicit Error(const std::string& what)
+      : std::runtime_error(what)
+    {
+    }
+  };
+
   enum { PRIORITY_NORMAL, PRIORITY_HIGH };
 
-  typedef boost::function<Ccnx::Name(const Ccnx::Name&)> Mapping;
-  typedef boost::function<void(Ccnx::Name& deviceName, Ccnx::Name& baseName, uint64_t seq, Ccnx::PcoPtr pco)>
-    SegmentCallback;
-  typedef boost::function<void(Ccnx::Name& deviceName, Ccnx::Name& baseName)> FinishCallback;
-  FetchManager(Ccnx::CcnxWrapperPtr ccnx,
-               const Mapping& mapping,
-               const Ccnx::Name& broadcastForwardingHint,
+  typedef function<Name(const Name&)> Mapping;
+  typedef function<void(Name& deviceName, Name& baseName, uint64_t seq, shared_ptr<Data> data)> SegmentCallback;
+  typedef function<void(Name& deviceName, Name& baseName)> FinishCallback;
+
+public:
+  FetchManager(Face& face, const Mapping& mapping, const Name& broadcastForwardingHint,
                uint32_t parallelFetches = 3,
                const SegmentCallback& defaultSegmentCallback = SegmentCallback(),
                const FinishCallback& defaultFinishCallback = FinishCallback(),
@@ -53,30 +60,26 @@
   virtual ~FetchManager();
 
   void
-  Enqueue(const Ccnx::Name& deviceName, const Ccnx::Name& baseName,
-          const SegmentCallback& segmentCallback, const FinishCallback& finishCallback,
-          uint64_t minSeqNo, uint64_t maxSeqNo, int priority = PRIORITY_NORMAL);
+  Enqueue(const Name& deviceName, const Name& baseName, const SegmentCallback& segmentCallback,
+          const FinishCallback& finishCallback, uint64_t minSeqNo, uint64_t maxSeqNo,
+          int priority = PRIORITY_NORMAL);
 
   // Enqueue using default callbacks
   void
-  Enqueue(const Ccnx::Name& deviceName, const Ccnx::Name& baseName, uint64_t minSeqNo,
-          uint64_t maxSeqNo, int priority = PRIORITY_NORMAL);
-
-  // only for Fetcher
-  inline Ccnx::CcnxWrapperPtr
-  GetCcnx();
+  Enqueue(const Name& deviceName, const Name& baseName, uint64_t minSeqNo, uint64_t maxSeqNo,
+          int priority = PRIORITY_NORMAL);
 
 private:
   // Fetch Events
   void
-  DidDataSegmentFetched(Fetcher& fetcher, uint64_t seqno, const Ccnx::Name& basename,
-                        const Ccnx::Name& name, Ccnx::PcoPtr data);
+  DidDataSegmentFetched(Fetcher& fetcher, uint64_t seqno, const Name& basename, const Name& name,
+                        shared_ptr<Data> data);
 
   void
   DidNoDataTimeout(Fetcher& fetcher);
 
   void
-  DidFetchComplete(Fetcher& fetcher, const Ccnx::Name& deviceName, const Ccnx::Name& baseName);
+  DidFetchComplete(Fetcher& fetcher, const Name& deviceName, const Name& baseName);
 
   void
   ScheduleFetches();
@@ -85,44 +88,33 @@
   TimedWait(Fetcher& fetcher);
 
 private:
-  Ndnx::NdnxWrapperPtr m_ndnx;
+  Face& m_face;
   Mapping m_mapping;
 
   uint32_t m_maxParallelFetches;
   uint32_t m_currentParallelFetches;
-  boost::mutex m_parellelFetchMutex;
+  std::mutex m_parellelFetchMutex;
 
   // optimized list structure for fetch queue
   typedef boost::intrusive::member_hook<Fetcher, boost::intrusive::list_member_hook<>,
-                                        &Fetcher::m_managerListHook>
-    MemberOption;
+                                        &Fetcher::m_managerListHook> MemberOption;
   typedef boost::intrusive::list<Fetcher, MemberOption> FetchList;
 
   FetchList m_fetchList;
-  SchedulerPtr m_scheduler;
-  ExecutorPtr m_executor;
-  TaskPtr m_scheduleFetchesTask;
+  Scheduler m_scheduler;
+  util::scheduler::ScopedEventId m_scheduledFetchesEvent;
+
   SegmentCallback m_defaultSegmentCallback;
   FinishCallback m_defaultFinishCallback;
   FetchTaskDbPtr m_taskDb;
 
-  const Ndnx::Name m_broadcastHint;
+  const Name m_broadcastHint;
+  boost::asio::io_service& m_ioService;
 };
 
-Ccnx::CcnxWrapperPtr
-FetchManager::GetCcnx()
-{
-  return m_ndnx;
-}
+typedef shared_ptr<FetchManager> FetchManagerPtr;
 
-typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str;
-namespace Error {
-struct FetchManager : virtual boost::exception, virtual std::exception
-{
-};
-}
-
-typedef boost::shared_ptr<FetchManager> FetchManagerPtr;
-
+} // namespace chronoshare
+} // namespace ndn
 
 #endif // FETCHER_H
diff --git a/src/fetch-task-db.cpp b/src/fetch-task-db.cpp
index 912f063..e753f95 100644
--- a/src/fetch-task-db.cpp
+++ b/src/fetch-task-db.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016, Regents of the University of California.
+ * Copyright (c) 2013-2017, Regents of the University of California.
  *
  * This file is part of ChronoShare, a decentralized file sharing application over NDN.
  *
@@ -17,15 +17,16 @@
  *
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
+
 #include "fetch-task-db.hpp"
 #include "db-helper.hpp"
 
-using namespace std;
-using namespace boost;
-using namespace Ndnx;
+namespace ndn {
+namespace chronoshare {
+
 namespace fs = boost::filesystem;
 
-const string INIT_DATABASE = "\
+const std::string INIT_DATABASE = "\
 CREATE TABLE IF NOT EXISTS                                      \n\
   Task(                                                         \n\
     deviceName  BLOB NOT NULL,                                  \n\
@@ -45,14 +46,12 @@
 
   int res = sqlite3_open((actualFolder / tag).c_str(), &m_db);
   if (res != SQLITE_OK) {
-    BOOST_THROW_EXCEPTION(
-      Error::Db() << errmsg_info_str("Cannot open database: " + (actualFolder / tag).string()));
+    BOOST_THROW_EXCEPTION(Error("Cannot open database: " + (actualFolder / tag).string()));
   }
 
   char* errmsg = 0;
   res = sqlite3_exec(m_db, INIT_DATABASE.c_str(), NULL, NULL, &errmsg);
   if (res != SQLITE_OK && errmsg != 0) {
-    // _LOG_TRACE ("Init \"error\": " << errmsg);
     sqlite3_free(errmsg);
   }
   else {
@@ -73,12 +72,13 @@
 {
   sqlite3_stmt* stmt;
   sqlite3_prepare_v2(m_db,
-                     "INSERT OR IGNORE INTO Task (deviceName, baseName, minSeqNo, maxSeqNo, priority) VALUES (?, ?, ?, ?, ?)",
+                     "INSERT OR IGNORE INTO Task(deviceName, baseName, minSeqNo, maxSeqNo, priority) VALUES(?, ?, ?, ?, ?)",
                      -1, &stmt, 0);
-  CcnxCharbufPtr deviceBuf = CcnxCharbufPtr(deviceName);
-  CcnxCharbufPtr baseBuf = CcnxCharbufPtr(baseName);
-  sqlite3_bind_blob(stmt, 1, deviceBuf->buf(), deviceBuf->length(), SQLITE_STATIC);
-  sqlite3_bind_blob(stmt, 2, baseBuf->buf(), baseBuf->length(), SQLITE_STATIC);
+
+  sqlite3_bind_blob(stmt, 1, deviceName.wireEncode().wire(), deviceName.wireEncode().size(),
+                    SQLITE_STATIC);
+  sqlite3_bind_blob(stmt, 2, baseName.wireEncode().wire(), baseName.wireEncode().size(),
+                    SQLITE_STATIC);
   sqlite3_bind_int64(stmt, 3, minSeqNo);
   sqlite3_bind_int64(stmt, 4, maxSeqNo);
   sqlite3_bind_int(stmt, 5, priority);
@@ -94,10 +94,12 @@
 {
   sqlite3_stmt* stmt;
   sqlite3_prepare_v2(m_db, "DELETE FROM Task WHERE deviceName = ? AND baseName = ?;", -1, &stmt, 0);
-  NdnxCharbufPtr deviceBuf = NdnxCharbufPtr(deviceName);
-  NdnxCharbufPtr baseBuf = NdnxCharbufPtr(baseName);
-  sqlite3_bind_blob(stmt, 1, deviceBuf->buf(), deviceBuf->length(), SQLITE_STATIC);
-  sqlite3_bind_blob(stmt, 2, baseBuf->buf(), baseBuf->length(), SQLITE_STATIC);
+
+  sqlite3_bind_blob(stmt, 1, deviceName.wireEncode().wire(), deviceName.wireEncode().size(),
+                    SQLITE_STATIC);
+  sqlite3_bind_blob(stmt, 2, baseName.wireEncode().wire(), baseName.wireEncode().size(),
+                    SQLITE_STATIC);
+
   int res = sqlite3_step(stmt);
   if (res == SQLITE_OK) {
   }
@@ -110,8 +112,10 @@
   sqlite3_stmt* stmt;
   sqlite3_prepare_v2(m_db, "SELECT * FROM Task;", -1, &stmt, 0);
   while (sqlite3_step(stmt) == SQLITE_ROW) {
-    Name deviceName(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
-    Name baseName(sqlite3_column_blob(stmt, 1), sqlite3_column_bytes(stmt, 1));
+    Name deviceName(Block(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0)));
+    Name baseName(Block(sqlite3_column_blob(stmt, 1), sqlite3_column_bytes(stmt, 1)));
+
+    std::cout << "deviceName: " << deviceName << " baseName: " << baseName << std::endl;
     uint64_t minSeqNo = sqlite3_column_int64(stmt, 2);
     uint64_t maxSeqNo = sqlite3_column_int64(stmt, 3);
     int priority = sqlite3_column_int(stmt, 4);
@@ -120,3 +124,6 @@
 
   sqlite3_finalize(stmt);
 }
+
+} // namespace chronoshare
+} // namespace ndn
diff --git a/src/fetch-task-db.hpp b/src/fetch-task-db.hpp
index ab3fdc9..45d405d 100644
--- a/src/fetch-task-db.hpp
+++ b/src/fetch-task-db.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016, Regents of the University of California.
+ * Copyright (c) 2013-2017, Regents of the University of California.
  *
  * This file is part of ChronoShare, a decentralized file sharing application over NDN.
  *
@@ -17,32 +17,48 @@
  *
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
+
 #ifndef FETCH_TASK_DB_H
 #define FETCH_TASK_DB_H
 
-#include <boost/filesystem.hpp>
-#include <boost/shared_ptr.hpp>
-#include <ccnx-common.h>
-#include <ccnx-name.h>
+#include "db-helper.hpp"
+#include "core/chronoshare-common.hpp"
+
+#include <ndn-cxx/name.hpp>
+
 #include <sqlite3.h>
 
+#include <boost/filesystem.hpp>
+
+namespace ndn {
+namespace chronoshare {
+
 class FetchTaskDb
 {
 public:
+  class Error : public DbHelper::Error
+  {
+  public:
+    explicit Error(const std::string& what)
+      : DbHelper::Error(what)
+    {
+    }
+  };
+
+  typedef function<void(const Name&, const Name&, uint64_t, uint64_t, int)> FetchTaskCallback;
+
+public:
   FetchTaskDb(const boost::filesystem::path& folder, const std::string& tag);
   ~FetchTaskDb();
 
   // task with same deviceName and baseName combination will be added only once
   // if task already exists, this call does nothing
   void
-  addTask(const Ccnx::Name& deviceName, const Ccnx::Name& baseName, uint64_t minSeqNo,
-          uint64_t maxSeqNo, int priority);
+  addTask(const Name& deviceName, const Name& baseName, uint64_t minSeqNo, uint64_t maxSeqNo,
+          int priority);
 
   void
-  deleteTask(const Ccnx::Name& deviceName, const Ccnx::Name& baseName);
-
-  typedef boost::function<void(const Ccnx::Name&, const Ccnx::Name&, uint64_t, uint64_t, int)>
-    FetchTaskCallback;
+  deleteTask(const Name& deviceName, const Name& baseName);
 
   void
   foreachTask(const FetchTaskCallback& callback);
@@ -51,6 +67,9 @@
   sqlite3* m_db;
 };
 
-typedef boost::shared_ptr<FetchTaskDb> FetchTaskDbPtr;
+typedef shared_ptr<FetchTaskDb> FetchTaskDbPtr;
+
+} // namespace chronoshare
+} // namespace ndn
 
 #endif // FETCH_TASK_DB_H
diff --git a/src/fetcher.cpp b/src/fetcher.cpp
index 83f8491..56899de 100644
--- a/src/fetcher.cpp
+++ b/src/fetcher.cpp
@@ -18,30 +18,26 @@
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
 
-#include "fetcher.h"
-#include "ccnx-pco.h"
-#include "fetch-manager.h"
-#include "logging.h"
+#include "fetcher.hpp"
+#include "fetch-manager.hpp"
+#include "core/logging.hpp"
 
+#include <boost/asio/io_service.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/make_shared.hpp>
-#include <boost/ref.hpp>
-#include <boost/throw_exception.hpp>
+
+namespace ndn {
+namespace chronoshare {
 
 _LOG_INIT(Fetcher);
 
-using namespace boost;
-using namespace std;
-using namespace Ndnx;
-
-Fetcher::Fetcher(Ccnx::CcnxWrapperPtr ccnx, ExecutorPtr executor,
-                 const SegmentCallback& segmentCallback, const FinishCallback& finishCallback,
-                 OnFetchCompleteCallback onFetchComplete, OnFetchFailedCallback onFetchFailed,
-                 const Ccnx::Name& deviceName, const Ccnx::Name& name, int64_t minSeqNo,
-                 int64_t maxSeqNo,
-                 boost::posix_time::time_duration timeout /* = boost::posix_time::seconds (30)*/,
-                 const Ccnx::Name& forwardingHint /* = Ccnx::Name ()*/)
-  : m_ccnx(ccnx)
+Fetcher::Fetcher(Face& face,
+                 const SegmentCallback& segmentCallback,
+                 const FinishCallback& finishCallback,
+                 const OnFetchCompleteCallback& onFetchComplete,
+                 const OnFetchFailedCallback& onFetchFailed,
+                 const Name& deviceName, const Name& name, int64_t minSeqNo, int64_t maxSeqNo,
+                 time::milliseconds timeout, const Name& forwardingHint)
+  : m_face(face)
 
   , m_segmentCallback(segmentCallback)
   , m_onFetchComplete(onFetchComplete)
@@ -57,14 +53,20 @@
 
   , m_minSendSeqNo(minSeqNo - 1)
   , m_maxInOrderRecvSeqNo(minSeqNo - 1)
-  , m_minSeqNo(minSeqNo)
+  // , m_minSeqNo(minSeqNo)
   , m_maxSeqNo(maxSeqNo)
 
   , m_pipeline(6) // initial "congestion window"
   , m_activePipeline(0)
-  , m_retryPause(0)
-  , m_nextScheduledRetry(date_time::second_clock<boost::posix_time::ptime>::universal_time())
-  , m_executor(executor) // must be 1
+
+  , m_slowStart(false)
+  , m_threshold(32767) // TODO make these values dynamic
+  , m_roundCount(32767)
+
+  , m_retryPause(time::seconds::zero())
+  , m_nextScheduledRetry(time::steady_clock::now())
+
+  , m_ioService(m_face.getIoService())
 {
 }
 
@@ -78,13 +80,13 @@
   m_active = true;
   m_minSendSeqNo = m_maxInOrderRecvSeqNo;
   // cout << "Restart: " << m_minSendSeqNo << endl;
-  m_lastPositiveActivity = date_time::second_clock<boost::posix_time::ptime>::universal_time();
+  m_lastPositiveActivity = time::steady_clock::now();
 
-  m_executor->execute(bind(&Fetcher::FillPipeline, this));
+  m_ioService.post(bind(&Fetcher::FillPipeline, this));
 }
 
 void
-Fetcher::SetForwardingHint(const Ccnx::Name& forwardingHint)
+Fetcher::SetForwardingHint(const Name& forwardingHint)
 {
   m_forwardingHint = forwardingHint;
 }
@@ -93,7 +95,7 @@
 Fetcher::FillPipeline()
 {
   for (; m_minSendSeqNo < m_maxSeqNo && m_activePipeline < m_pipeline; m_minSendSeqNo++) {
-    unique_lock<mutex> lock(m_seqNoMutex);
+    std::unique_lock<std::mutex> lock(m_seqNoMutex);
 
     if (m_outOfOrderRecvSeqNo.find(m_minSendSeqNo + 1) != m_outOfOrderRecvSeqNo.end())
       continue;
@@ -103,72 +105,66 @@
 
     m_inActivePipeline.insert(m_minSendSeqNo + 1);
 
-    _LOG_DEBUG(" >>> i " << Name(m_forwardingHint)(m_name) << ", seq = " << (m_minSendSeqNo + 1));
+    _LOG_DEBUG(
+      " >>> i " << Name(m_forwardingHint).append(m_name) << ", seq = " << (m_minSendSeqNo + 1));
 
     // cout << ">>> " << m_minSendSeqNo+1 << endl;
-    m_ccnx->sendInterest(Name(m_forwardingHint)(m_name)(m_minSendSeqNo + 1),
-                         Closure(bind(&Fetcher::OnData, this, m_minSendSeqNo + 1, _1, _2),
-                                 bind(&Fetcher::OnTimeout, this, m_minSendSeqNo + 1, _1, _2, _3)),
-                         Selectors().interestLifetime(1)); // Alex: this lifetime should be changed to RTO
+
+    Interest interest(
+      Name(m_forwardingHint).append(m_name).appendNumber(m_minSendSeqNo + 1)); // Alex: this lifetime should be changed to RTO
+    _LOG_DEBUG("interest Name: " << interest);
+    interest.setInterestLifetime(time::seconds(1));
+    m_face.expressInterest(interest,
+                           bind(&Fetcher::OnData, this, m_minSendSeqNo + 1, _1, _2),
+                           bind(&Fetcher::OnTimeout, this, m_minSendSeqNo + 1, _1));
+
     _LOG_DEBUG(" >>> i ok");
 
     m_activePipeline++;
   }
 }
-
 void
-Fetcher::OnData(uint64_t seqno, const Ccnx::Name& name, PcoPtr data)
+Fetcher::OnData(uint64_t seqno, const Interest& interest, Data& data)
 {
-  m_executor->execute(bind(&Fetcher::OnData_Execute, this, seqno, name, data));
-}
+  const Name& name = data.getName();
+  _LOG_DEBUG(" <<< d " << name.getSubName(0, name.size() - 1) << ", seq = " << seqno);
 
-void
-Fetcher::OnData_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::PcoPtr data)
-{
-  _LOG_DEBUG(" <<< d " << name.getPartialName(0, name.size() - 1) << ", seq = " << seqno);
+  shared_ptr<Data> pco = make_shared<Data>(data.wireEncode());
 
   if (m_forwardingHint == Name()) {
     // TODO: check verified!!!!
     if (true) {
-      if (!m_segmentCallback.empty()) {
-        m_segmentCallback(m_deviceName, m_name, seqno, data);
+      if (m_segmentCallback != nullptr) {
+        m_segmentCallback(m_deviceName, m_name, seqno, pco);
       }
     }
     else {
-      _LOG_ERROR("Can not verify signature content. Name = " << data->name());
+      _LOG_ERROR("Can not verify signature content. Name = " << data.getName());
       // probably needs to do more in the future
     }
     // we don't have to tell FetchManager about this
   }
   else {
     // in this case we don't care whether "data" is verified,  in fact, we expect it is unverified
-    try {
-      PcoPtr pco = make_shared<ParsedContentObject>(*data->contentPtr());
 
-      // we need to verify this pco and apply callback only when verified
-      // TODO: check verified !!!
-      if (true) {
-        if (!m_segmentCallback.empty()) {
-          m_segmentCallback(m_deviceName, m_name, seqno, pco);
-        }
-      }
-      else {
-        _LOG_ERROR("Can not verify signature content. Name = " << pco->name());
-        // probably needs to do more in the future
+    // we need to verify this pco and apply callback only when verified
+    // TODO: check verified !!!
+    if (true) {
+      if (m_segmentCallback != nullptr) {
+        m_segmentCallback(m_deviceName, m_name, seqno, pco);
       }
     }
-    catch (MisformedContentObjectException& e) {
-      cerr << "MisformedContentObjectException..." << endl;
-      // no idea what should do...
-      // let's ignore for now
+    else {
+      _LOG_ERROR("Can not verify signature content. Name = " << pco->getName());
+      // probably needs to do more in the future
     }
   }
 
   m_activePipeline--;
-  m_lastPositiveActivity = date_time::second_clock<boost::posix_time::ptime>::universal_time();
+  m_lastPositiveActivity = time::steady_clock::now();
 
   {
-    unique_lock<mutex> lock (m_pipelineMutex);
+    std::unique_lock<std::mutex> lock(m_seqNoMutex);
     if(m_slowStart){
       m_pipeline++;
       if(m_pipeline == m_threshold)
@@ -184,16 +180,16 @@
     }
   }
 
-  _LOG_DEBUG ("slowStart: " << boolalpha << m_slowStart << " pipeline: " << m_pipeline << " threshold: " << m_threshold);
+  _LOG_DEBUG ("slowStart: " << std::boolalpha << m_slowStart << " pipeline: " << m_pipeline << " threshold: " << m_threshold);
 
 
   ////////////////////////////////////////////////////////////////////////////
-  unique_lock<mutex> lock(m_seqNoMutex);
+  std::unique_lock<std::mutex> lock(m_seqNoMutex);
 
   m_outOfOrderRecvSeqNo.insert(seqno);
   m_inActivePipeline.erase(seqno);
   _LOG_DEBUG("Total segments received: " << m_outOfOrderRecvSeqNo.size());
-  set<int64_t>::iterator inOrderSeqNo = m_outOfOrderRecvSeqNo.begin();
+  std::set<int64_t>::iterator inOrderSeqNo = m_outOfOrderRecvSeqNo.begin();
   for (; inOrderSeqNo != m_outOfOrderRecvSeqNo.end(); inOrderSeqNo++) {
     _LOG_TRACE("Checking " << *inOrderSeqNo << " and " << m_maxInOrderRecvSeqNo + 1);
     if (*inOrderSeqNo == m_maxInOrderRecvSeqNo + 1) {
@@ -209,54 +205,47 @@
   m_outOfOrderRecvSeqNo.erase(m_outOfOrderRecvSeqNo.begin(), inOrderSeqNo);
   ////////////////////////////////////////////////////////////////////////////
 
-  _LOG_TRACE("Max in order received: " << m_maxInOrderRecvSeqNo
-                                       << ", max seqNo to request: " << m_maxSeqNo);
+  _LOG_TRACE("Max in order received: " << m_maxInOrderRecvSeqNo << ", max seqNo to request: " << m_maxSeqNo);
 
   if (m_maxInOrderRecvSeqNo == m_maxSeqNo) {
     _LOG_TRACE("Fetch finished: " << m_name);
     m_active = false;
     // invoke callback
-    if (!m_finishCallback.empty()) {
+    if (m_finishCallback != nullptr) {
       _LOG_TRACE("Notifying callback");
       m_finishCallback(m_deviceName, m_name);
     }
 
     // tell FetchManager that we have finish our job
-    // m_onFetchComplete (*this);
+    // m_onFetchComplete(*this);
     // using executor, so we won't be deleted if there is scheduled FillPipeline call
-    if (!m_onFetchComplete.empty()) {
+    if (m_onFetchComplete != nullptr) {
       m_timedwait = true;
-      m_executor->execute(bind(m_onFetchComplete, ref(*this), m_deviceName, m_name));
+      m_ioService.post(bind(m_onFetchComplete, std::ref(*this), m_deviceName, m_name));
     }
   }
   else {
-    m_executor->execute(bind(&Fetcher::FillPipeline, this));
+    m_ioService.post(bind(&Fetcher::FillPipeline, this));
   }
 }
 
 void
-Fetcher::OnTimeout(uint64_t seqno, const Ccnx::Name& name, const Closure& closure, Selectors selectors)
+Fetcher::OnTimeout(uint64_t seqno, const Interest& interest)
 {
-  _LOG_DEBUG(this << ", " << m_executor.get());
-  m_executor->execute(bind(&Fetcher::OnTimeout_Execute, this, seqno, name, closure, selectors));
-}
-
-void
-Fetcher::OnTimeout_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::Closure closure,
-                           Ccnx::Selectors selectors)
-{
-  _LOG_DEBUG(" <<< :( timeout " << name.getPartialName(0, name.size() - 1) << ", seq = " << seqno);
+  const Name name = interest.getName();
+  _LOG_DEBUG(" <<< :( timeout " << name.getSubName(0, name.size() - 1) << ", seq = " << seqno);
 
   // cout << "Fetcher::OnTimeout: " << name << endl;
   // cout << "Last: " << m_lastPositiveActivity << ", config: " << m_maximumNoActivityPeriod
   //      << ", now: " << date_time::second_clock<boost::posix_time::ptime>::universal_time()
-  //      << ", oldest: " << (date_time::second_clock<boost::posix_time::ptime>::universal_time() - m_maximumNoActivityPeriod) << endl;
+  //      << ", oldest: " <<(date_time::second_clock<boost::posix_time::ptime>::universal_time() -
+  //      m_maximumNoActivityPeriod) << endl;
 
-  if (m_lastPositiveActivity < (date_time::second_clock<boost::posix_time::ptime>::universal_time() -
-                                m_maximumNoActivityPeriod)) {
+  if (m_lastPositiveActivity <
+      (time::steady_clock::now() - m_maximumNoActivityPeriod)) {
     bool done = false;
     {
-      unique_lock<mutex> lock(m_seqNoMutex);
+      std::unique_lock<std::mutex> lock(m_seqNoMutex);
       m_inActivePipeline.erase(seqno);
       m_activePipeline--;
 
@@ -267,20 +256,25 @@
 
     if (done) {
       {
-        unique_lock<mutex> lock(m_seqNoMutex);
+        std::unique_lock<std::mutex> lock(m_seqNoMutex);
         _LOG_DEBUG("Telling that fetch failed");
         _LOG_DEBUG("Active pipeline size should be zero: " << m_inActivePipeline.size());
       }
 
       m_active = false;
-      if (!m_onFetchFailed.empty()) {
-        m_onFetchFailed(ref(*this));
+      if (m_onFetchFailed != nullptr) {
+        m_onFetchFailed(std::ref(*this));
       }
       // this is not valid anymore, but we still should be able finish work
     }
   }
   else {
     _LOG_DEBUG("Asking to reexpress seqno: " << seqno);
-    m_ccnx->sendInterest(name, closure, selectors);
+    m_face.expressInterest(interest,
+                           bind(&Fetcher::OnData, this, seqno, _1, _2), // TODO: correct?
+                           bind(&Fetcher::OnTimeout, this, seqno, _1)); // TODO: correct?
   }
 }
+
+} // namespace chronoshare
+} // namespace ndn
diff --git a/src/fetcher.hpp b/src/fetcher.hpp
index c1da2a3..40d5258 100644
--- a/src/fetcher.hpp
+++ b/src/fetcher.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016, Regents of the University of California.
+ * Copyright (c) 2013-2017, Regents of the University of California.
  *
  * This file is part of ChronoShare, a decentralized file sharing application over NDN.
  *
@@ -18,47 +18,46 @@
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
 
-#ifndef FETCHER_H
-#define FETCHER_H
+#ifndef CHRONOSHARE_SRC_FETCHER_HPP
+#define CHRONOSHARE_SRC_FETCHER_HPP
 
-#include "ccnx-name.h"
-#include "ccnx-wrapper.h"
+#include "core/chronoshare-common.hpp"
 
-#include "executor.h"
-#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <ndn-cxx/face.hpp>
+
+#include <set>
+#include <thread>
+#include <mutex>
 #include <boost/intrusive/list.hpp>
-#include <set>
 
-#include <set>
+namespace ndn {
+namespace chronoshare {
 
 class FetchManager;
 
 class Fetcher
 {
 public:
-  typedef boost::function<void(Ccnx::Name& deviceName, Ccnx::Name& baseName, uint64_t seq, Ccnx::PcoPtr pco)>
-    SegmentCallback;
-  typedef boost::function<void(Ccnx::Name& deviceName, Ccnx::Name& baseName)> FinishCallback;
-  typedef boost::function<void(Fetcher&, const Ccnx::Name& deviceName, const Ccnx::Name& baseName)>
-    OnFetchCompleteCallback;
-  typedef boost::function<void(Fetcher&)> OnFetchFailedCallback;
+  typedef std::function<void(Name& deviceName, Name& baseName, uint64_t seq, shared_ptr<Data> data)> SegmentCallback;
+  typedef std::function<void(Name& deviceName, Name& baseName)> FinishCallback;
+  typedef std::function<void(Fetcher&, const Name& deviceName, const Name& baseName)> OnFetchCompleteCallback;
+  typedef std::function<void(Fetcher&)> OnFetchFailedCallback;
 
-  Fetcher(Ccnx::CcnxWrapperPtr ccnx, ExecutorPtr executor,
+  Fetcher(Face& face,
           const SegmentCallback& segmentCallback, // callback passed by caller of FetchManager
           const FinishCallback& finishCallback,   // callback passed by caller of FetchManager
-          OnFetchCompleteCallback onFetchComplete,
-          OnFetchFailedCallback onFetchFailed, // callbacks provided by FetchManager
-          const Ccnx::Name& deviceName, const Ccnx::Name& name, int64_t minSeqNo, int64_t maxSeqNo,
-          boost::posix_time::time_duration timeout =
-            boost::posix_time::seconds(30), // this time is not precise, but sets min bound
-                                            // actual time depends on how fast Interests timeout
-          const Ccnx::Name& forwardingHint = Ccnx::Name());
+          const OnFetchCompleteCallback& onFetchComplete,
+          const OnFetchFailedCallback& onFetchFailed, // callbacks provided by FetchManager
+          const Name& deviceName, const Name& name, int64_t minSeqNo, int64_t maxSeqNo,
+          time::milliseconds timeout = time::seconds(30), // this time is not precise, but sets min bound
+                                                          // actual time depends on how fast Interests timeout
+          const Name& forwardingHint = Name());
   virtual ~Fetcher();
 
-  inline bool
+  bool
   IsActive() const;
 
-  inline bool
+  bool
   IsTimedWait() const
   {
     return m_timedwait;
@@ -68,46 +67,46 @@
   RestartPipeline();
 
   void
-  SetForwardingHint(const Ccnx::Name& forwardingHint);
+  SetForwardingHint(const Name& forwardingHint);
 
-  const Ccnx::Name&
+  const Name&
   GetForwardingHint() const
   {
     return m_forwardingHint;
   }
 
-  const Ccnx::Name&
+  const Name&
   GetName() const
   {
     return m_name;
   }
 
-  const Ccnx::Name&
+  const Name&
   GetDeviceName() const
   {
     return m_deviceName;
   }
 
-  double
+  time::seconds
   GetRetryPause() const
   {
     return m_retryPause;
   }
 
   void
-  SetRetryPause(double pause)
+  SetRetryPause(time::seconds pause)
   {
     m_retryPause = pause;
   }
 
-  boost::posix_time::ptime
+  const time::steady_clock::TimePoint&
   GetNextScheduledRetry() const
   {
     return m_nextScheduledRetry;
   }
 
   void
-  SetNextScheduledRetry(boost::posix_time::ptime nextScheduledRetry)
+  SetNextScheduledRetry(const time::steady_clock::TimePoint& nextScheduledRetry)
   {
     m_nextScheduledRetry = nextScheduledRetry;
   }
@@ -117,24 +116,16 @@
   FillPipeline();
 
   void
-  OnData(uint64_t seqno, const Ccnx::Name& name, Ccnx::PcoPtr data);
+  OnData(uint64_t seqno, const Interest& interest, Data& data);
 
   void
-  OnData_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::PcoPtr data);
-
-  void
-  OnTimeout(uint64_t seqno, const Ccnx::Name& name, const Ccnx::Closure& closure,
-            Ccnx::Selectors selectors);
-
-  void
-  OnTimeout_Execute(uint64_t seqno, Ccnx::Name name, Ccnx::Closure closure,
-                    Ccnx::Selectors selectors);
+  OnTimeout(uint64_t seqno, const Interest& interest);
 
 public:
   boost::intrusive::list_member_hook<> m_managerListHook;
 
 private:
-  Ndnx::NdnxWrapperPtr m_ndnx;
+  Face& m_face;
 
   SegmentCallback m_segmentCallback;
   OnFetchCompleteCallback m_onFetchComplete;
@@ -145,55 +136,47 @@
   bool m_active;
   bool m_timedwait;
 
-  Ndnx::Name m_name;
-  Ndnx::Name m_deviceName;
-  Ndnx::Name m_forwardingHint;
+  Name m_name;
+  Name m_deviceName;
+  Name m_forwardingHint;
 
-  boost::posix_time::time_duration m_maximumNoActivityPeriod;
+  time::milliseconds m_maximumNoActivityPeriod;
 
   int64_t m_minSendSeqNo;
   int64_t m_maxInOrderRecvSeqNo;
   std::set<int64_t> m_outOfOrderRecvSeqNo;
   std::set<int64_t> m_inActivePipeline;
 
-  int64_t m_minSeqNo;
+  // int64_t m_minSeqNo;
   int64_t m_maxSeqNo;
 
   uint32_t m_pipeline;
   uint32_t m_activePipeline;
-  double m_rto;
-  double m_maxRto;
+  // double m_rto;
+  // double m_maxRto;
   bool m_slowStart;
   uint32_t m_threshold;
   uint32_t m_roundCount;
 
-  boost::posix_time::ptime m_lastPositiveActivity;
+  time::steady_clock::TimePoint m_lastPositiveActivity;
 
-  double m_retryPause; // pause to stop trying to fetch (for fetch-manager)
-  boost::posix_time::ptime m_nextScheduledRetry;
+  time::seconds m_retryPause; // pause to stop trying to fetch(for fetch-manager)
+  time::steady_clock::TimePoint m_nextScheduledRetry;
 
-  ExecutorPtr m_executor; // to serialize FillPipeline events
+  std::mutex m_seqNoMutex;
 
-  boost::mutex m_seqNoMutex;
-  boost::mutex m_rtoMutex;
-  boost::mutex m_pipelineMutex;
+  boost::asio::io_service& m_ioService;
 };
 
-typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str;
+typedef shared_ptr<Fetcher> FetcherPtr;
 
-namespace Error {
-struct Fetcher : virtual boost::exception, virtual std::exception
-{
-};
-}
-
-typedef boost::shared_ptr<Fetcher> FetcherPtr;
-
-bool
+inline bool
 Fetcher::IsActive() const
 {
   return m_active;
 }
 
+} // namespace chronoshare
+} // namespace ndn
 
-#endif // FETCHER_H
+#endif // CHRONOSHARE_SRC_FETCHER_HPP
