diff --git a/src/group-manager-db.cpp b/src/group-manager-db.cpp
new file mode 100644
index 0000000..7a955b5
--- /dev/null
+++ b/src/group-manager-db.cpp
@@ -0,0 +1,331 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California
+ *
+ * This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
+ * See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
+ *
+ * ndn-group-encrypt 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-group-encrypt 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-group-encrypt, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Zhiyi Zhang <dreamerbarrychang@gmail.com>
+ */
+
+#include "group-manager-db.hpp"
+
+#include <sqlite3.h>
+#include <boost/filesystem.hpp>
+#include <ndn-cxx/util/sqlite3-statement.hpp>
+#include <ndn-cxx/security/identity-certificate.hpp>
+
+namespace ndn {
+namespace gep {
+
+using util::Sqlite3Statement;
+
+static const std::string INITIALIZATION =
+  "CREATE TABLE IF NOT EXISTS                         \n"
+  "  schedules(                                       \n"
+  "    schedule_id         INTEGER PRIMARY KEY,       \n"
+  "    schedule_name       TEXT NOT NULL,             \n"
+  "    schedule            BLOB NOT NULL              \n"
+  "  );                                               \n"
+  "CREATE UNIQUE INDEX IF NOT EXISTS                  \n"
+  "   scheduleNameIndex ON schedules(schedule_name);  \n"
+  "                                                   \n"
+  "CREATE TABLE IF NOT EXISTS                         \n"
+  "  members(                                         \n"
+  "    member_id           INTEGER PRIMARY KEY,       \n"
+  "    schedule_id         INTEGER NOT NULL,          \n"
+  "    member_name         BLOB NOT NULL,             \n"
+  "    member_cert         BLOB NOT NULL,             \n"
+  "    FOREIGN KEY(schedule_id)                       \n"
+  "      REFERENCES schedules(schedule_id)            \n"
+  "      ON DELETE CASCADE                            \n"
+  "      ON UPDATE CASCADE                            \n"
+  "  );                                               \n"
+  "CREATE UNIQUE INDEX IF NOT EXISTS                  \n"
+  "   memNameIndex ON members(member_name);           \n";
+
+class GroupManagerDB::Impl
+{
+public:
+  Impl(const std::string& dbDir)
+  {
+    // open Database
+
+    int result = sqlite3_open_v2(dbDir.c_str(), &m_database,
+                                 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
+#ifdef NDN_CXX_DISABLE_SQLITE3_FS_LOCKING
+                                 "unix-dotfile"
+#else
+                                 nullptr
+#endif
+                                 );
+
+    if (result != SQLITE_OK)
+      BOOST_THROW_EXCEPTION(Error("GroupManager DB cannot be opened/created: " + dbDir));
+
+    // enable foreign key
+    sqlite3_exec(m_database, "PRAGMA foreign_keys = ON", nullptr, nullptr, nullptr);
+
+    // initialize database specific tables
+    char* errorMessage = nullptr;
+    result = sqlite3_exec(m_database, INITIALIZATION.c_str(), nullptr, nullptr, &errorMessage);
+    if (result != SQLITE_OK && errorMessage != nullptr) {
+      sqlite3_free(errorMessage);
+      BOOST_THROW_EXCEPTION(Error("GroupManager DB cannot be initialized"));
+    }
+  }
+
+  ~Impl()
+  {
+    sqlite3_close(m_database);
+  }
+
+  int
+  getScheduleId(const std::string& name) const
+  {
+    Sqlite3Statement statement(m_database,
+                               "SELECT schedule_id FROM schedules WHERE schedule_name=?");
+    statement.bind(1, name, SQLITE_TRANSIENT);
+
+    int result = -1;
+    if (statement.step() == SQLITE_ROW)
+      result = statement.getInt(0);
+    return result;
+  }
+
+public:
+  sqlite3* m_database;
+};
+
+GroupManagerDB::GroupManagerDB(const std::string& dbDir)
+  : m_impl(new Impl(dbDir))
+{
+}
+
+GroupManagerDB::~GroupManagerDB() = default;
+
+bool
+GroupManagerDB::hasSchedule(const std::string& name) const
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT schedule_id FROM schedules where schedule_name=?");
+  statement.bind(1, name, SQLITE_TRANSIENT);
+  return (statement.step() == SQLITE_ROW);
+}
+
+std::list<std::string>
+GroupManagerDB::listAllScheduleNames() const
+{
+  std::list<std::string> result;
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT schedule_name FROM schedules");
+
+  result.clear();
+  while (statement.step() == SQLITE_ROW) {
+    result.push_back(statement.getString(0));
+  }
+  return result;
+}
+
+Schedule
+GroupManagerDB::getSchedule(const std::string& name) const
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT schedule FROM schedules where schedule_name=?");
+  statement.bind(1, name, SQLITE_TRANSIENT);
+
+  Schedule result;
+  if (statement.step() == SQLITE_ROW) {
+    result.wireDecode(statement.getBlock(0));
+  }
+  else {
+    BOOST_THROW_EXCEPTION(Error("Cannot get the result from database"));
+  }
+  return result;
+}
+
+std::map<Name, Data>
+GroupManagerDB::getScheduleMembers(const std::string& name) const
+{
+  std::map<Name, Data> result;
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT member_name, member_cert\
+                              FROM members JOIN schedules\
+                              ON members.schedule_id=schedules.schedule_id\
+                              WHERE schedule_name=?");
+  statement.bind(1, name, SQLITE_TRANSIENT);
+
+  result.clear();
+  while (statement.step() == SQLITE_ROW) {
+    result.insert(std::pair<Name, Data>(Name(statement.getBlock(0)),
+                                        Data(statement.getBlock(1))));
+  }
+  return result;
+}
+
+void
+GroupManagerDB::addSchedule(const std::string& name, const Schedule& schedule)
+{
+  BOOST_ASSERT(name.length() != 0);
+
+  Sqlite3Statement statement(m_impl->m_database,
+                             "INSERT INTO schedules (schedule_name, schedule)\
+                              values (?, ?)");
+  statement.bind(1, name, SQLITE_TRANSIENT);
+  statement.bind(2, schedule.wireEncode(), SQLITE_TRANSIENT);
+  if (statement.step() != SQLITE_DONE)
+    BOOST_THROW_EXCEPTION(Error("Cannot add the schedule to database"));
+}
+
+void
+GroupManagerDB::deleteSchedule(const std::string& name)
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "DELETE FROM schedules WHERE schedule_name=?");
+  statement.bind(1, name, SQLITE_TRANSIENT);
+  statement.step();
+}
+
+void
+GroupManagerDB::renameSchedule(const std::string& oldName, const std::string& newName)
+{
+  BOOST_ASSERT(newName.length() != 0);
+
+  Sqlite3Statement statement(m_impl->m_database,
+                             "UPDATE schedules SET schedule_name=? WHERE schedule_name=?");
+  statement.bind(1, newName, SQLITE_TRANSIENT);
+  statement.bind(2, oldName, SQLITE_TRANSIENT);
+  if (statement.step() != SQLITE_DONE)
+    BOOST_THROW_EXCEPTION(Error("Cannot rename the schedule from database"));
+}
+
+void
+GroupManagerDB::updateSchedule(const std::string& name, const Schedule& schedule)
+{
+  if (!hasSchedule(name)) {
+    addSchedule(name, schedule);
+    return;
+  }
+
+  Sqlite3Statement statement(m_impl->m_database,
+                             "UPDATE schedules SET schedule=? WHERE schedule_name=?");
+  statement.bind(1, schedule.wireEncode(), SQLITE_TRANSIENT);
+  statement.bind(2, name, SQLITE_TRANSIENT);
+  statement.step();
+}
+
+bool
+GroupManagerDB::hasMember(const Name& identity) const
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT member_id FROM members WHERE member_name=?");
+  statement.bind(1, identity.wireEncode(), SQLITE_TRANSIENT);
+  return (statement.step() == SQLITE_ROW);
+}
+
+std::list<Name>
+GroupManagerDB::listAllMembers() const
+{
+  std::list<Name> result;
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT member_name FROM members");
+
+  result.clear();
+  while (statement.step() == SQLITE_ROW) {
+    result.push_back(Name(statement.getBlock(0)));
+  }
+  return result;
+}
+
+Data
+GroupManagerDB::getMemberCert(const Name& identity) const
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT member_cert FROM members WHERE member_name=?");
+  statement.bind(1, identity.wireEncode(), SQLITE_TRANSIENT);
+  Data result;
+  if (statement.step() == SQLITE_ROW) {
+    result.wireDecode(statement.getBlock(0));
+  }
+  else {
+    BOOST_THROW_EXCEPTION(Error("Cannot get the result from database"));
+  }
+  return result;
+}
+
+std::string
+GroupManagerDB::getMemberSchedule(const Name& identity) const
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "SELECT schedule_name\
+                              FROM schedules JOIN members\
+                              ON schedules.schedule_id = members.schedule_id\
+                              WHERE member_name=?");
+  statement.bind(1, identity.wireEncode(), SQLITE_TRANSIENT);
+
+  std::string result = "";
+  if (statement.step() == SQLITE_ROW) {
+    result = statement.getString(0);
+  }
+  else {
+    BOOST_THROW_EXCEPTION(Error("Cannot get the result from database"));
+  }
+  return result;
+}
+
+void
+GroupManagerDB::addMember(const std::string& scheduleName, const Data& certificate)
+{
+  int scheduleId = m_impl->getScheduleId(scheduleName);
+  if (scheduleId == -1)
+    BOOST_THROW_EXCEPTION(Error("The schedule dose not exist"));
+
+  IdentityCertificate cert(certificate);
+  Name memberName = cert.getPublicKeyName().getPrefix(-1);
+
+  Sqlite3Statement statement(m_impl->m_database,
+                             "INSERT INTO members(schedule_id, member_name, member_cert)\
+                              values (?, ?, ?)");
+  statement.bind(1, scheduleId);
+  statement.bind(2, memberName.wireEncode(), SQLITE_TRANSIENT);
+  statement.bind(3, certificate.wireEncode(), SQLITE_TRANSIENT);
+  if (statement.step() != SQLITE_DONE)
+    BOOST_THROW_EXCEPTION(Error("Cannot add the member to database"));
+}
+
+void
+GroupManagerDB::updateMemberSchedule(const Name& identity, const std::string& scheduleName)
+{
+  int scheduleId = m_impl->getScheduleId(scheduleName);
+  if (scheduleId == -1)
+    BOOST_THROW_EXCEPTION(Error("The schedule dose not exist"));
+
+  Sqlite3Statement statement(m_impl->m_database,
+                             "UPDATE members SET schedule_id=? WHERE member_name=?");
+  statement.bind(1, scheduleId);
+  statement.bind(2, identity.wireEncode(), SQLITE_TRANSIENT);
+  statement.step();
+}
+
+void
+GroupManagerDB::deleteMember(const Name& identity)
+{
+  Sqlite3Statement statement(m_impl->m_database,
+                             "DELETE FROM members WHERE member_name=?");
+  statement.bind(1, identity.wireEncode(), SQLITE_TRANSIENT);
+  statement.step();
+}
+
+} // namespace gep
+} // namespace ndn
diff --git a/src/group-manager-db.hpp b/src/group-manager-db.hpp
new file mode 100644
index 0000000..e64d677
--- /dev/null
+++ b/src/group-manager-db.hpp
@@ -0,0 +1,178 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California
+ *
+ * This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
+ * See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
+ *
+ * ndn-group-encrypt 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-group-encrypt 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-group-encrypt, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Zhiyi Zhang <dreamerbarrychang@gmail.com>
+ */
+
+#ifndef GEP_GROUP_MANAGER_DB_HPP
+#define GEP_GROUP_MANAGER_DB_HPP
+
+#include "schedule.hpp"
+
+namespace ndn {
+namespace gep {
+
+/**
+ * @brief GroupManagerDB is a class to manage the database of group manager.
+ *
+ * It contains two tables to store Schedules and Members
+ */
+class GroupManagerDB
+{
+public:
+  class Error : public std::runtime_error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : std::runtime_error(what)
+    {
+    }
+  };
+
+public:
+  explicit
+  GroupManagerDB(const std::string& dbDir);
+
+  ~GroupManagerDB();
+
+public:
+  ////////////////////////////////////////////////////// schedule management
+
+  /**
+   * @brief Check if there is a schedule with @p name
+   */
+  bool
+  hasSchedule(const std::string& name) const;
+
+  /**
+   * @brief List all the names of the schedules
+   * @return A list of the name of all schedules.
+   */
+  std::list<std::string>
+  listAllScheduleNames() const;
+
+  /**
+   * @brief Get a schedule with @p name.
+   * @throw Error if the schedule does not exist
+   */
+  Schedule
+  getSchedule(const std::string& name) const;
+
+  /**
+   * @brief Get member information of a schedule with @p name.
+   * The member information include member name and certificate.
+   */
+  std::map<Name, Data>
+  getScheduleMembers(const std::string& name) const;
+
+  /**
+   * @brief Add a @p schedule with @p name
+   * @pre Name.length() != 0
+   *
+   * @throw Error if add operation fails, e.g., a schedule with the same name already exists
+   */
+  void
+  addSchedule(const std::string& name, const Schedule& schedule);
+
+  /**
+   * @brief Delete the schedule with @p name
+   */
+  void
+  deleteSchedule(const std::string& name);
+
+  /**
+   * @brief Rename a schedule with @p oldName to @p newName
+   * @pre newName.length() != 0
+   *
+   * @throw Error if update operation fails, e.g., a schedule with @p newName already exists
+   */
+  void
+  renameSchedule(const std::string& oldName, const std::string& newName);
+
+  /**
+   * @brief Update the schedule with @p name and replace the old object with @p schedule
+   *
+   * if no schedule with @p name exists, a new schedule
+   * with @p name and @p schedule will be added to database
+   */
+  void
+  updateSchedule(const std::string& name, const Schedule& schedule);
+
+  ////////////////////////////////////////////////////// member management
+
+  /**
+   * @brief Check if there is a member with name @p identity
+   */
+  bool
+  hasMember(const Name& identity) const;
+
+  /**
+   * @brief List all the members
+   */
+  std::list<Name>
+  listAllMembers() const;
+
+  /**
+   * @brief Get the certificate of the member with name @p identity
+   *
+   * @throw Error if there is no member with name @p identity in database
+   */
+  Data
+  getMemberCert(const Name& identity) const;
+
+  /**
+   * @brief Get the schedule name of a member with name @p identity
+   *
+   * @throw Error if there is no member with name @p identity in database
+   */
+  std::string
+  getMemberSchedule(const Name& identity) const;
+
+  /**
+   * @brief Add a new member with @p certificate into a schedule with name @p scheduleName.
+   *
+   * @throw Error when there's no schedule named @p scheduleName
+   * @throw Error if add operation fails, e.g., a member with the same name exists
+   */
+  void
+  addMember(const std::string& scheduleName, const Data& certificate);
+
+  /**
+   * @brief Change the schedule of a member with name @p identity to a schedule with @p scheduleName
+   *
+   * @throw Error when there's no schedule named @p scheduleName
+   */
+  void
+  updateMemberSchedule(const Name& identity, const std::string& scheduleName);
+
+  /**
+   * @brief Delete a member with name @p identity from database
+   */
+  void
+  deleteMember(const Name& identity);
+
+private:
+  class Impl;
+  unique_ptr<Impl> m_impl;
+};
+
+} // namespace gep
+} // namespace ndn
+
+#endif // GEP_GROUP_MANAGER_DB_HPP
diff --git a/src/schedule.cpp b/src/schedule.cpp
index 301e0fe..ac68bdd 100644
--- a/src/schedule.cpp
+++ b/src/schedule.cpp
@@ -125,6 +125,7 @@
 Schedule&
 Schedule::addWhiteInterval(const RepetitiveInterval& repetitiveInterval)
 {
+  m_wire.reset();
   m_whiteIntervalList.insert(repetitiveInterval);
   return *this;
 }
@@ -132,15 +133,20 @@
 Schedule&
 Schedule::addBlackInterval(const RepetitiveInterval& repetitiveInterval)
 {
+  m_wire.reset();
   m_blackIntervalList.insert(repetitiveInterval);
   return *this;
 }
 
-Interval
+std::tuple<bool, Interval>
 Schedule::getCoveringInterval(const TimeStamp& tp) const
 {
-  Interval blackResult;
-  Interval whiteResult(true);
+  Interval blackPositiveResult(true);
+  Interval whitePositiveResult(true);
+
+  Interval blackNegativeResult;
+  Interval whiteNegativeResult;
+
   Interval tempInterval;
   bool isPositive;
 
@@ -148,28 +154,51 @@
   for (const RepetitiveInterval& element : m_blackIntervalList) {
     std::tie(isPositive, tempInterval) = element.getInterval(tp);
     if (isPositive == true) {
-      // tempInterval is a black repetitive interval covering the time stamp, return empty interval
-      return Interval(true);
+      // tempInterval is covering the time stamp, || to the black negative result
+      // get the union interval of all the black interval covering the timestamp
+      // return false and the union interval
+      blackPositiveResult || tempInterval;
     }
     else {
-      // tempInterval is not covering the time stamp, && the tempInterval to the blackResult
-      if (!blackResult.isValid())
-        blackResult = tempInterval;
+      // tempInterval is not covering the time stamp, && to the black positive result
+      // get the intersection interval of all the black interval not covering the timestamp
+      // return true if white positive result is not empty, false if white positive result is empty
+      if (!blackNegativeResult.isValid())
+        blackNegativeResult = tempInterval;
       else
-        blackResult && tempInterval;
+        blackNegativeResult && tempInterval;
     }
   }
 
+  // if black positive result is not full, the result must be false
+  if (!blackPositiveResult.isEmpty())
+    return std::make_tuple(false, blackPositiveResult);
+
   // get the whiteResult
   for (const RepetitiveInterval& element : m_whiteIntervalList) {
     std::tie(isPositive, tempInterval) = element.getInterval(tp);
     if (isPositive == true) {
-      // tempInterval is a white repetitive interval covering the time stamp, || to the white result
-      whiteResult || tempInterval;
+      // tempInterval is covering the time stamp, || to the white positive result
+      // get the union interval of all the white interval covering the timestamp
+      // return true
+      whitePositiveResult || tempInterval;
+    }
+    else {
+      // tempInterval is not covering the time, && to the white negative result
+      // get the intersection of all the white interval not covering the timestamp
+      // return false if positive result is empty, return true if positive result is not empty
+      if (!whiteNegativeResult.isValid())
+        whiteNegativeResult = tempInterval;
+      else
+        whiteNegativeResult && tempInterval;
     }
   }
 
-  return whiteResult && blackResult;
+  // return false if positive result is empty, return true if positive result is not empty
+  if (!whitePositiveResult.isEmpty())
+    return std::make_tuple(true, whitePositiveResult && blackNegativeResult);
+  else
+    return std::make_tuple(false, whiteNegativeResult);
 }
 
 } // namespace gep
diff --git a/src/schedule.hpp b/src/schedule.hpp
index 80ecb32..e11b221 100644
--- a/src/schedule.hpp
+++ b/src/schedule.hpp
@@ -66,8 +66,10 @@
    *
    * Function iterates two repetitive interval sets and find out
    * the shortest interval that allows group member to have the access to the data
+   * if there's no interval covering the @p ts, function will return false and
+   * return a negative interval
    */
-  Interval
+  std::tuple<bool, Interval>
   getCoveringInterval(const TimeStamp& ts) const;
 
 private:
diff --git a/tests/unit-tests/group-manager-db.t.cpp b/tests/unit-tests/group-manager-db.t.cpp
new file mode 100644
index 0000000..2c23fab
--- /dev/null
+++ b/tests/unit-tests/group-manager-db.t.cpp
@@ -0,0 +1,324 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2015,  Regents of the University of California
+ *
+ * This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
+ * See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
+ *
+ * ndn-group-encrypt 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-group-encrypt 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-group-encrypt, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Zhiyi Zhang <dreamerbarrychang@gmail.com>
+ */
+
+#include "group-manager-db.hpp"
+#include "boost-test.hpp"
+
+#include <boost/filesystem.hpp>
+
+namespace ndn {
+namespace gep {
+namespace tests {
+
+const uint8_t DATA[] = {
+0x06, 0xfd, 0x02, 0xd7, 0x07, 0x38, 0x08, 0x03, 0x6e, 0x64, 0x6e, 0x08, 0x03, 0x4b, 0x45,
+0x59, 0x08, 0x05, 0x73, 0x69, 0x74, 0x65, 0x31, 0x08, 0x11, 0x6b, 0x73, 0x6b, 0x2d, 0x31,
+0x34, 0x31, 0x36, 0x34, 0x32, 0x35, 0x33, 0x37, 0x37, 0x30, 0x39, 0x34, 0x08, 0x07, 0x49,
+0x44, 0x2d, 0x43, 0x45, 0x52, 0x54, 0x08, 0x09, 0xfd, 0x00, 0x00, 0x01, 0x49, 0xc9, 0x8b,
+0x2e, 0x73, 0x14, 0x03, 0x18, 0x01, 0x02, 0x15, 0xfd, 0x01, 0x61, 0x30, 0x82, 0x01, 0x5d,
+0x30, 0x22, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x34, 0x31, 0x31, 0x31, 0x39, 0x31, 0x39, 0x33,
+0x33, 0x30, 0x32, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x35, 0x31, 0x31, 0x31, 0x39, 0x31,
+0x39, 0x33, 0x33, 0x30, 0x32, 0x5a, 0x30, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x29,
+0x13, 0x0a, 0x2f, 0x6e, 0x64, 0x6e, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x31, 0x30, 0x82, 0x01,
+0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00,
+0xb6, 0x54, 0x7e, 0xe8, 0xf2, 0x91, 0x7d, 0xc1, 0x6d, 0xcb, 0x25, 0x44, 0x97, 0x90, 0xdc,
+0x78, 0x15, 0x0e, 0xef, 0xb5, 0xe7, 0xfd, 0x09, 0x2c, 0xf8, 0xd5, 0x9c, 0x2f, 0xe5, 0xa6,
+0xae, 0x9d, 0x7e, 0x95, 0x2d, 0xfc, 0xc7, 0xc3, 0x43, 0x46, 0xb0, 0x6f, 0x53, 0xcd, 0xcd,
+0x6a, 0x29, 0x1d, 0x95, 0xa1, 0x62, 0xcd, 0xa9, 0xf2, 0xf8, 0xe2, 0xfa, 0x8b, 0x5d, 0xfe,
+0xa1, 0x2b, 0x15, 0x3f, 0x7f, 0x71, 0xe6, 0x3e, 0xb9, 0xb1, 0x29, 0xd1, 0x22, 0x6f, 0x56,
+0xdf, 0xb6, 0x85, 0xaf, 0xd4, 0xb3, 0x67, 0x8b, 0x94, 0xb8, 0x83, 0xcb, 0x72, 0x86, 0xc4,
+0xf2, 0x86, 0xb2, 0x7c, 0x94, 0xbc, 0x38, 0x7b, 0x8c, 0x92, 0x86, 0x36, 0x83, 0x0e, 0x11,
+0x8c, 0x95, 0x49, 0xff, 0xcc, 0x16, 0x62, 0xdb, 0x55, 0x40, 0x7f, 0xc8, 0x8d, 0xe4, 0x3f,
+0x87, 0x02, 0x87, 0xaf, 0xf6, 0x2f, 0x8a, 0x7d, 0x74, 0x10, 0xd3, 0xbb, 0xa3, 0xfe, 0x5a,
+0x7b, 0x8f, 0x56, 0x09, 0x8b, 0x49, 0x46, 0x9f, 0x7d, 0x55, 0xa3, 0x4a, 0xe8, 0x22, 0x7b,
+0x80, 0x8a, 0x6f, 0xde, 0x9f, 0xfb, 0x2f, 0xeb, 0xf7, 0x29, 0x8a, 0x38, 0x67, 0x41, 0xae,
+0x21, 0x7a, 0xe3, 0x7b, 0x96, 0x1a, 0x90, 0x35, 0x7d, 0x04, 0xaa, 0x4d, 0x9f, 0xe6, 0xd6,
+0x00, 0x17, 0x4e, 0x02, 0x34, 0x6c, 0x56, 0x3a, 0x81, 0x3c, 0xb4, 0x7f, 0x98, 0x48, 0x22,
+0xa0, 0x9f, 0x53, 0x35, 0xf9, 0x4e, 0xae, 0x8f, 0xc3, 0xfa, 0x0b, 0x93, 0xd4, 0x55, 0x78,
+0x05, 0xb0, 0x40, 0x44, 0x48, 0x74, 0xb7, 0x9b, 0x2d, 0x65, 0xf0, 0x3d, 0x2e, 0x87, 0x2b,
+0x48, 0x29, 0x12, 0x85, 0xf0, 0xaf, 0xc4, 0xdc, 0x73, 0xce, 0x18, 0x8b, 0xd9, 0x4c, 0x60,
+0x15, 0x51, 0xae, 0x47, 0x1e, 0x2b, 0x54, 0xde, 0xf6, 0xba, 0x77, 0x30, 0x5d, 0x68, 0x9a,
+0xfb, 0x02, 0x01, 0x11, 0x16, 0x2d, 0x1b, 0x01, 0x01, 0x1c, 0x28, 0x07, 0x26, 0x08, 0x03,
+0x6e, 0x64, 0x6e, 0x08, 0x03, 0x4b, 0x45, 0x59, 0x08, 0x11, 0x6b, 0x73, 0x6b, 0x2d, 0x31,
+0x34, 0x31, 0x36, 0x34, 0x32, 0x35, 0x32, 0x39, 0x35, 0x35, 0x34, 0x36, 0x08, 0x07, 0x49,
+0x44, 0x2d, 0x43, 0x45, 0x52, 0x54, 0x17, 0xfd, 0x01, 0x00, 0x26, 0x40, 0xbc, 0xf0, 0x28,
+0x12, 0x69, 0x94, 0x11, 0x13, 0xff, 0x47, 0x2c, 0x6b, 0x12, 0xdd, 0xfa, 0x60, 0x92, 0xe9,
+0x59, 0x10, 0x98, 0xd8, 0x11, 0x2a, 0xf0, 0x25, 0xb0, 0x03, 0xb2, 0xda, 0xd3, 0xb6, 0xa9,
+0xfb, 0x8b, 0xc3, 0x6f, 0xfb, 0xb4, 0x93, 0x9b, 0x24, 0x9f, 0x7e, 0x63, 0x8a, 0x37, 0xea,
+0x88, 0x74, 0xac, 0x0c, 0x04, 0x5b, 0xa2, 0x39, 0x0c, 0xa1, 0x9e, 0x0e, 0xa2, 0xd6, 0x74,
+0xca, 0xc4, 0x92, 0x64, 0x9f, 0xc2, 0x68, 0x56, 0xef, 0xc5, 0x11, 0xe8, 0x7a, 0xf3, 0x21,
+0xde, 0x88, 0x40, 0x70, 0x2b, 0x44, 0xe0, 0xcb, 0x3b, 0x33, 0xc6, 0x53, 0x65, 0x70, 0x56,
+0x08, 0xe2, 0x22, 0x70, 0x9e, 0xe0, 0x38, 0x18, 0xa8, 0x7c, 0x7d, 0x09, 0x15, 0xac, 0xf1,
+0x44, 0x63, 0x5d, 0xd5, 0x59, 0xf4, 0xeb, 0x60, 0x6c, 0x6e, 0x77, 0x36, 0x20, 0x2a, 0xe2,
+0xd1, 0x2d, 0xa1, 0x7d, 0xd4, 0x6d, 0x29, 0x2d, 0x88, 0xde, 0x9e, 0xf8, 0x64, 0x41, 0x6a,
+0xeb, 0x9f, 0x3b, 0x52, 0x06, 0xb1, 0x94, 0x09, 0x3b, 0xc9, 0xba, 0xa0, 0x05, 0x31, 0x2d,
+0x49, 0x17, 0x5b, 0xc1, 0x62, 0xf5, 0x19, 0xce, 0x27, 0x7b, 0xe8, 0x4b, 0xeb, 0x80, 0x36,
+0xf3, 0xd7, 0xe9, 0x59, 0x22, 0x50, 0x5a, 0x14, 0xb0, 0x1a, 0xa5, 0x6b, 0x33, 0xb2, 0x83,
+0x72, 0x11, 0xf4, 0xd5, 0xd2, 0x32, 0x93, 0x94, 0xb6, 0x8d, 0xed, 0xcd, 0xce, 0x54, 0x79,
+0xe8, 0xc3, 0x3c, 0xa8, 0xc6, 0x71, 0xa7, 0x61, 0xba, 0x70, 0x44, 0x94, 0xc9, 0xfc, 0xd0,
+0x20, 0x00, 0x87, 0xdc, 0xf3, 0x3c, 0x47, 0x1b, 0x4f, 0x91, 0x4c, 0xc7, 0x49, 0xb7, 0xe4,
+0xe3, 0x84, 0xb7, 0x82, 0x52, 0xec, 0x91, 0xa9, 0x28, 0x38, 0x2d, 0x48, 0x89, 0xc7, 0xcf,
+0xfa, 0x63, 0x0b, 0xf0, 0x62, 0x51, 0xac, 0xe9, 0xdb, 0xfd, 0x1c
+};
+
+const uint8_t SCHEDULE[] = {
+  0x8f, 0xc4,// Schedule
+  0x8d, 0x90,// WhiteIntervalList
+  0x8c, 0x2e, // RepetitiveInterval
+    0x86, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x35, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x87, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x38, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x88, 0x01,
+      0x05,
+    0x89, 0x01,
+      0x0a,
+    0x8a, 0x01,
+      0x02,
+    0x8b, 0x01,
+      0x01,
+  0x8c, 0x2e, // RepetitiveInterval
+    0x86, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x35, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x87, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x38, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x88, 0x01,
+      0x06,
+    0x89, 0x01,
+      0x08,
+    0x8a, 0x01,
+      0x01,
+    0x8b, 0x01,
+      0x01,
+  0x8c, 0x2e, // RepetitiveInterval
+    0x86, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x35, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x87, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x35, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x88, 0x01,
+      0x04,
+    0x89, 0x01,
+      0x07,
+    0x8a, 0x01,
+      0x00,
+    0x8b, 0x01,
+      0x00,
+  0x8e, 0x30, // BlackIntervalList
+  0x8c, 0x2e, // RepetitiveInterval
+     0x86, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x37, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x87, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x37, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x88, 0x01,
+      0x07,
+    0x89, 0x01,
+      0x08,
+    0x8a, 0x01,
+      0x00,
+    0x8b, 0x01,
+      0x00
+};
+
+const uint8_t REPETITIVE_INTERVAL[] = {
+  0x8c, 0x2e, // RepetitiveInterval
+    0x86, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x38, 0x32, 0x35, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x87, 0x0f,
+      0x32, 0x30, 0x31, 0x35, 0x30, 0x39, 0x32, 0x31, 0x54, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x88, 0x01,
+      0x02,
+    0x89, 0x01,
+      0x0a,
+    0x8a, 0x01,
+      0x05,
+    0x8b, 0x01,
+      0x01
+};
+
+class GroupManagerDBFixture
+{
+public:
+  GroupManagerDBFixture()
+    : tmpPath(boost::filesystem::path(TMP_TESTS_PATH))
+  {
+    boost::filesystem::create_directories(tmpPath);
+  }
+
+  ~GroupManagerDBFixture()
+  {
+    boost::filesystem::remove_all(tmpPath);
+  }
+
+public:
+  boost::filesystem::path tmpPath;
+};
+
+BOOST_FIXTURE_TEST_SUITE(TestGroupManagerDB, GroupManagerDBFixture)
+
+BOOST_AUTO_TEST_CASE(DatabaseFunctions)
+{
+  // construction
+  std::string dbDir = tmpPath.c_str();
+  dbDir += "/test.db";
+  GroupManagerDB db(dbDir);
+
+  Block dataBlock(DATA, sizeof(DATA));
+  Block scheduleBlock(SCHEDULE, sizeof(SCHEDULE));
+
+  // create schedule
+  Schedule schedule(scheduleBlock);
+
+  // create member
+  Data data1(dataBlock);
+  data1.setName(Name("/ndn/BoyA/KEY/ksk-123/ID-CERT/123"));
+  Data data2(dataBlock);
+  data2.setName(Name("/ndn/BoyB/KEY/ksk-123/ID-CERT/123"));
+  Data data3(dataBlock);
+  data3.setName(Name("/ndn/GirlC/KEY/ksk-123/ID-CERT/123"));
+  Data data4(dataBlock);
+  data4.setName(Name("/ndn/GirlD/KEY/ksk-123/ID-CERT/123"));
+  Data data5(dataBlock);
+  data5.setName(Name("/ndn/Hello/KEY/ksk-123/ID-CERT/123"));
+
+  // add schedules into the database
+  BOOST_CHECK_NO_THROW(db.addSchedule("work-time", schedule));
+  BOOST_CHECK_NO_THROW(db.addSchedule("rest-time", schedule));
+  BOOST_CHECK_NO_THROW(db.addSchedule("play-time", schedule));
+  BOOST_CHECK_NO_THROW(db.addSchedule("boelter-time", schedule));
+
+  // throw exception when adding a schedule called an existing name
+  BOOST_CHECK_THROW(db.addSchedule("boelter-time", schedule), GroupManagerDB::Error);
+
+  // add members into the database
+  BOOST_CHECK_NO_THROW(db.addMember("work-time", data1));
+  BOOST_CHECK_NO_THROW(db.addMember("rest-time", data2));
+  BOOST_CHECK_NO_THROW(db.addMember("play-time", data3));
+  BOOST_CHECK_NO_THROW(db.addMember("play-time", data4));
+
+  // throw exception when adding a member having a not existing schedule name
+  BOOST_CHECK_THROW(db.addMember("false-time", data5), GroupManagerDB::Error);
+
+  BOOST_CHECK_NO_THROW(db.addMember("boelter-time", data5));
+
+  // throw exception when adding a member having an existing identity
+  BOOST_CHECK_THROW(db.addMember("work-time", data5), GroupManagerDB::Error);
+
+  // has function
+  BOOST_CHECK_EQUAL(db.hasSchedule("work-time"), true);
+  BOOST_CHECK_EQUAL(db.hasSchedule("rest-time"), true);
+  BOOST_CHECK_EQUAL(db.hasSchedule("play-time"), true);
+  BOOST_CHECK_EQUAL(db.hasSchedule("sleep-time"), false);
+  BOOST_CHECK_EQUAL(db.hasSchedule(""), false);
+
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/BoyA")), true);
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/BoyB")), true);
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/BoyC")), false);
+
+  // get schedule
+  Schedule scheduleResult = db.getSchedule("work-time");
+  BOOST_CHECK(scheduleResult.wireEncode() == scheduleBlock);
+
+  scheduleResult = db.getSchedule("play-time");
+  BOOST_CHECK(scheduleResult.wireEncode() == scheduleBlock);
+
+  // throw exception when there is no such schedule in database
+  BOOST_CHECK_THROW(db.getSchedule("work-time-11"), GroupManagerDB::Error);
+
+  // get certificate of a member
+  Data dataResult = db.getMemberCert(Name("/ndn/BoyA"));
+  BOOST_CHECK(dataResult.wireEncode() == data1.wireEncode());
+
+  dataResult = db.getMemberCert(Name("/ndn/GirlC"));
+  BOOST_CHECK(dataResult.wireEncode() == data3.wireEncode());
+
+  // throw error when there is no such member in database
+  BOOST_CHECK_THROW(db.getMemberCert(Name("/ndn/GirlA")), GroupManagerDB::Error);
+
+  // list all schedule names
+  std::list<std::string> names = db.listAllScheduleNames();
+  BOOST_CHECK(std::find(names.begin(), names.end(), "work-time") != names.end());
+  BOOST_CHECK(std::find(names.begin(), names.end(), "play-time") != names.end());
+  BOOST_CHECK(std::find(names.begin(), names.end(), "rest-time") != names.end());
+  BOOST_CHECK(std::find(names.begin(), names.end(), "sleep-time") == names.end());
+
+  // list members of a schedule
+  std::map<Name, Data> memberMap = db.getScheduleMembers("play-time");
+  BOOST_CHECK(memberMap.size() != 0);
+
+  // when there's no such schedule, the return list's size is 0
+  BOOST_CHECK_EQUAL(db.getScheduleMembers("sleep-time").size(), 0);
+
+  // list all members
+  std::list<Name> members = db.listAllMembers();
+  BOOST_CHECK(std::find(members.begin(), members.end(), Name("/ndn/GirlC")) != members.end());
+  BOOST_CHECK(std::find(members.begin(), members.end(), Name("/ndn/GirlD")) != members.end());
+  BOOST_CHECK(std::find(members.begin(), members.end(), Name("/ndn/BoyA")) != members.end());
+  BOOST_CHECK(std::find(members.begin(), members.end(), Name("/ndn/BoyB")) != members.end());
+
+  // rename schedule
+  BOOST_CHECK_EQUAL(db.hasSchedule("boelter-time"), true);
+  db.renameSchedule("boelter-time", "rieber-time");
+  BOOST_CHECK_EQUAL(db.hasSchedule("boelter-time"), false);
+  BOOST_CHECK_EQUAL(db.hasSchedule("rieber-time"), true);
+  BOOST_CHECK_EQUAL(db.getMemberSchedule("/ndn/Hello"), "rieber-time");
+
+  // update schedule
+  Schedule newSchedule(scheduleBlock);
+  Block repIntervalBlock(REPETITIVE_INTERVAL, sizeof(REPETITIVE_INTERVAL));
+  newSchedule.addWhiteInterval(RepetitiveInterval(repIntervalBlock));
+  db.updateSchedule("rieber-time", newSchedule);
+  scheduleResult = db.getSchedule("rieber-time");
+  BOOST_CHECK(scheduleResult.wireEncode() != scheduleBlock);
+  BOOST_CHECK(scheduleResult.wireEncode() == newSchedule.wireEncode());
+
+  // add a new schedule when update a not existing schedule
+  BOOST_CHECK_EQUAL(db.hasSchedule("ralphs-time"), false);
+  db.updateSchedule("ralphs-time", newSchedule);
+  BOOST_CHECK_EQUAL(db.hasSchedule("ralphs-time"), true);
+
+  // update schedule of member
+  db.updateMemberSchedule(Name("/ndn/Hello"), "play-time");
+  BOOST_CHECK_EQUAL(db.getMemberSchedule(Name("/ndn/Hello")), "play-time");
+
+  // delete member
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/Hello")), true);
+  db.deleteMember(Name("/ndn/Hello"));
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/Hello")), false);
+
+  // delete a not existing member
+  BOOST_CHECK_NO_THROW(db.deleteMember(Name("/ndn/notExisting")));
+
+  // delete the schedule and all the members using this schedule should be deleted
+  db.deleteSchedule("play-time");
+  BOOST_CHECK_EQUAL(db.hasSchedule("play-time"), false);
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/GirlC")), false);
+  BOOST_CHECK_EQUAL(db.hasMember(Name("/ndn/GirlD")), false);
+
+  // delete a not existing schedule
+  BOOST_CHECK_NO_THROW(db.deleteSchedule("not-existing-time"));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace gep
+} // namespace ndn
diff --git a/tests/unit-tests/schedule.t.cpp b/tests/unit-tests/schedule.t.cpp
index 80560c5..22f2a10 100644
--- a/tests/unit-tests/schedule.t.cpp
+++ b/tests/unit-tests/schedule.t.cpp
@@ -35,10 +35,10 @@
   Schedule schedule;
 
   RepetitiveInterval interval1(from_iso_string("20150825T000000"),
-                               from_iso_string("20150828T000000"),
+                               from_iso_string("20150827T000000"),
                                5, 10, 2, RepetitiveInterval::RepeatUnit::DAY);
   RepetitiveInterval interval2(from_iso_string("20150825T000000"),
-                               from_iso_string("20150828T000000"),
+                               from_iso_string("20150827T000000"),
                                6, 8, 1, RepetitiveInterval::RepeatUnit::DAY);
   RepetitiveInterval interval3(from_iso_string("20150827T000000"),
                                from_iso_string("20150827T000000"),
@@ -53,38 +53,51 @@
   schedule.addBlackInterval(interval3);
 
   Interval resultInterval;
+  bool isPositive;
 
-  // tp1 --> 8.25 4-10
+  // tp1 --> positive 8.25 4-10
   TimeStamp tp1 = from_iso_string("20150825T063000");
-  resultInterval = schedule.getCoveringInterval(tp1);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp1);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T040000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
 
-  // tp2 --> 8.26 6-8
+  // tp2 --> positive 8.26 6-8
   TimeStamp tp2 = from_iso_string("20150826T073000");
-  resultInterval = schedule.getCoveringInterval(tp2);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp2);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150826T060000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T080000");
 
-  // tp3 --> 8.27 5-7
+  // tp3 --> positive 8.27 5-7
   TimeStamp tp3 = from_iso_string("20150827T053000");
-  resultInterval = schedule.getCoveringInterval(tp3);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp3);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150827T050000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150827T070000");
 
-  // tp4 --> 8.27 5-7
+  // tp4 --> positive 8.27 5-7
   TimeStamp tp4 = from_iso_string("20150827T063000");
-  resultInterval = schedule.getCoveringInterval(tp4);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp4);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150827T050000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150827T070000");
 
-  // tp5 --> No
+  // tp5 --> negative 8.27 7-8
   TimeStamp tp5 = from_iso_string("20150827T073000");
-  BOOST_CHECK_EQUAL(schedule.getCoveringInterval(tp5).isEmpty(), true);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp5);
+  BOOST_CHECK_EQUAL(isPositive, false);
+  BOOST_CHECK_EQUAL(resultInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150827T070000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150827T080000");
 
-  // tp6 --> No
+  // tp6 --> negative 8.25 10-24
   TimeStamp tp6 = from_iso_string("20150825T113000");
-  BOOST_CHECK_EQUAL(schedule.getCoveringInterval(tp6).isEmpty(), true);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp6);
+  BOOST_CHECK_EQUAL(isPositive, false);
+  BOOST_CHECK_EQUAL(resultInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T100000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T000000");
 }
 
 const uint8_t SCHEDULE[] = {
@@ -178,28 +191,19 @@
 
   Schedule schedule2(block);
   Interval resultInterval;
+  bool isPositive;
 
-  // tp1 --> 8.25 4-10
+  // tp1 --> positive 8.25 4-10
   TimeStamp tp1 = from_iso_string("20150825T063000");
-  resultInterval = schedule2.getCoveringInterval(tp1);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp1);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T040000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
 
-  // tp2 --> 8.26 6-8
+  // tp2 --> positive 8.26 6-8
   TimeStamp tp2 = from_iso_string("20150826T073000");
-  resultInterval = schedule2.getCoveringInterval(tp2);
-  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150826T060000");
-  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T080000");
-
-  Schedule schedule3(block2);
-
-  // tp1 --> 8.25 4-10
-  resultInterval = schedule3.getCoveringInterval(tp1);
-  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T040000");
-  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
-
-  // tp2 --> 8.26 6-8
-  resultInterval = schedule3.getCoveringInterval(tp2);
+  std::tie(isPositive, resultInterval) = schedule.getCoveringInterval(tp2);
+  BOOST_CHECK_EQUAL(isPositive, true);
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150826T060000");
   BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T080000");
 }
diff --git a/tests/wscript b/tests/wscript
index 706697a..6018bdb 100644
--- a/tests/wscript
+++ b/tests/wscript
@@ -19,4 +19,5 @@
         use='ndn-group-encrypt tests-main',
         includes=['.'],
         install_path=None,
+	defines='TMP_TESTS_PATH=\"%s/tmp-tests\"' % bld.bldnode,
         )
