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:
