diff --git a/src/interval.cpp b/src/interval.cpp
new file mode 100644
index 0000000..f5738a1
--- /dev/null
+++ b/src/interval.cpp
@@ -0,0 +1,114 @@
+/* -*- 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 "interval.hpp"
+
+namespace ndn {
+namespace gep {
+
+static const TimeStamp DEFAULT_TIME = boost::posix_time::from_iso_string("14000101T000000");
+
+Interval::Interval(bool isValid)
+  : m_startTime(DEFAULT_TIME)
+  , m_endTime(DEFAULT_TIME)
+  , m_isValid(isValid)
+{
+}
+
+Interval::Interval(const TimeStamp& startTime,
+                   const TimeStamp& endTime)
+  : m_startTime(startTime)
+  , m_endTime(endTime)
+  , m_isValid(true)
+{
+  BOOST_ASSERT(startTime < endTime);
+}
+
+bool
+Interval::covers(const TimeStamp& tp) const
+{
+  BOOST_ASSERT(isValid());
+
+  if (isEmpty())
+    return false;
+  return (m_startTime <= tp && tp < m_endTime);
+}
+
+Interval&
+Interval::operator &&(const Interval& interval)
+{
+  BOOST_ASSERT(isValid() && interval.isValid());
+
+  // if one is empty, result is empty
+  if (isEmpty() || interval.isEmpty()) {
+    m_startTime = m_endTime;
+    return *this;
+  }
+  // two intervals do not have intersection
+  if (m_startTime >= interval.getEndTime() || m_endTime <= interval.getStartTime()) {
+    m_startTime = m_endTime;
+    return *this;
+  }
+
+  // get the start time
+  if (m_startTime <= interval.getStartTime())
+    m_startTime = interval.getStartTime();
+
+  // get the end time
+  if (m_endTime > interval.getEndTime())
+    m_endTime = interval.getEndTime();
+
+  return *this;
+}
+
+Interval&
+Interval::operator ||(const Interval& interval)
+{
+  BOOST_ASSERT(this->isValid() && interval.isValid());
+
+  if (isEmpty()) {
+    // left interval is empty, return left one
+    m_startTime = interval.getStartTime();
+    m_endTime = interval.getEndTime();
+    return *this;
+  }
+  if (interval.isEmpty()) {
+    // right interval is empty, return right one
+    return *this;
+  }
+  if (m_startTime >= interval.getEndTime() || m_endTime <= interval.getStartTime()) {
+    // two intervals do not have intersection
+    BOOST_THROW_EXCEPTION(Error("cannot generate a union interval when there's no intersection"));
+  }
+
+  // get the start time
+  if (m_startTime > interval.getStartTime())
+    m_startTime = interval.getStartTime();
+
+  // get the end time
+  if (m_endTime <= interval.getEndTime())
+    m_endTime = interval.getEndTime();
+
+  return *this;
+}
+
+} // namespace gep
+} // namespace ndn
diff --git a/src/interval.hpp b/src/interval.hpp
new file mode 100644
index 0000000..5764454
--- /dev/null
+++ b/src/interval.hpp
@@ -0,0 +1,124 @@
+/* -*- 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 NDN_GEP_INTERVAL_HPP
+#define NDN_GEP_INTERVAL_HPP
+
+#include "common.hpp"
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+namespace ndn {
+namespace gep {
+
+typedef boost::posix_time::ptime TimeStamp;
+
+///@brief Interval define a time duration which contains a start timestamp and an end timestamp
+class Interval
+{
+public:
+  class Error : public std::runtime_error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : std::runtime_error(what)
+    {
+    }
+  };
+
+public:
+  /**
+   * @brief Construction to create an object
+   *
+   * @parameter isValid If isValid is true, the created interval is an empty interval
+   */
+  explicit
+  Interval(bool isValid = false);
+
+  Interval(const TimeStamp& startTime,
+           const TimeStamp& endTime);
+
+  /**
+   * @brief Check if the timestamp tp is in the interval
+   * @pre this->isValid() == true
+   *
+   * @parameter tp A timestamp
+   */
+  bool
+  covers(const TimeStamp& tp) const;
+
+  /**
+   * @brief Get the intersection interval of two intervals
+   * @pre this->isValid() == true && interval.isValid() == true
+   *
+   * Two intervals should all be valid but they can be empty
+   */
+  Interval&
+  operator &&(const Interval& interval);
+
+  /**
+   * @brief Get the union set interval of two intervals
+   * @pre this->isValid() == true && interval.isValid() == true
+   *
+   * Two intervals should all be valid but they can be empty
+   */
+  Interval&
+  operator ||(const Interval& interval);
+
+  const TimeStamp&
+  getStartTime() const
+  {
+    BOOST_ASSERT(isValid());
+    return m_startTime;
+  }
+
+  const TimeStamp&
+  getEndTime() const
+  {
+    BOOST_ASSERT(isValid());
+    return m_endTime;
+  }
+
+  bool
+  isValid() const
+  {
+    return m_isValid;
+  }
+
+  bool
+  isEmpty() const
+  {
+    BOOST_ASSERT(isValid());
+    return m_startTime == m_endTime;
+  }
+
+private:
+  TimeStamp m_startTime;
+  TimeStamp m_endTime;
+
+  bool m_isValid;
+};
+
+} // namespace gep
+} // namespace ndn
+
+#endif // NDN_GEP_INTERVAL_HPP
diff --git a/src/repetitive-interval.cpp b/src/repetitive-interval.cpp
new file mode 100644
index 0000000..2a441b5
--- /dev/null
+++ b/src/repetitive-interval.cpp
@@ -0,0 +1,275 @@
+/* -*- 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 "repetitive-interval.hpp"
+#include "tlv.hpp"
+
+#include <ndn-cxx/encoding/block-helpers.hpp>
+#include <ndn-cxx/util/concepts.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+namespace ndn {
+namespace gep {
+
+static const TimeStamp DEFAULT_TIME = boost::posix_time::from_iso_string("14000101T000000");
+
+BOOST_CONCEPT_ASSERT((WireEncodable<RepetitiveInterval>));
+BOOST_CONCEPT_ASSERT((WireDecodable<RepetitiveInterval>));
+
+RepetitiveInterval::RepetitiveInterval()
+  : m_startDate(DEFAULT_TIME)
+  , m_endDate(DEFAULT_TIME)
+  , m_intervalStartHour(0)
+  , m_intervalEndHour(24)
+  , m_nRepeats(0)
+  , m_unit(RepeatUnit::NONE)
+{
+}
+
+RepetitiveInterval::RepetitiveInterval(const Block& block)
+{
+  wireDecode(block);
+}
+
+RepetitiveInterval::RepetitiveInterval(const TimeStamp& startDate,
+                                       const TimeStamp& endDate,
+                                       size_t intervalStartHour,
+                                       size_t intervalEndHour,
+                                       size_t nRepeats,
+                                       RepeatUnit unit)
+  : m_startDate(startDate)
+  , m_endDate(endDate)
+  , m_intervalStartHour(intervalStartHour)
+  , m_intervalEndHour(intervalEndHour)
+  , m_nRepeats(nRepeats)
+  , m_unit(unit)
+{
+  BOOST_ASSERT(m_intervalStartHour < m_intervalEndHour);
+  BOOST_ASSERT(m_startDate.date() <= m_endDate.date());
+  BOOST_ASSERT(m_intervalEndHour <= 24);
+  if (unit == RepeatUnit::NONE)
+    BOOST_ASSERT(m_startDate.date() == m_endDate.date());
+}
+
+template<encoding::Tag TAG>
+size_t
+RepetitiveInterval::wireEncode(EncodingImpl<TAG>& encoder) const
+{
+  using namespace boost::posix_time;
+
+  size_t totalLength = 0;
+
+  // RepeatUnit
+  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::RepeatUnit,
+                                                  static_cast<size_t>(m_unit));
+  // NRepeat
+  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::NRepeats, m_nRepeats);
+  // IntervalEndHour
+  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::IntervalEndHour, m_intervalEndHour);
+  // IntervalStartHour
+  totalLength += prependNonNegativeIntegerBlock(encoder, tlv::IntervalStartHour,
+                                                m_intervalStartHour);
+  // EndDate
+  totalLength += prependStringBlock(encoder, tlv::EndDate, to_iso_string(m_endDate));
+  // StartDate
+  totalLength += prependStringBlock(encoder, tlv::StartDate, to_iso_string(m_startDate));
+
+  totalLength += encoder.prependVarNumber(totalLength);
+  totalLength += encoder.prependVarNumber(tlv::RepetitiveInterval);
+
+  return totalLength;
+}
+
+const Block&
+RepetitiveInterval::wireEncode() const
+{
+  if (m_wire.hasWire())
+    return m_wire;
+
+  EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  this->m_wire = buffer.block();
+  return m_wire;
+}
+
+void
+RepetitiveInterval::wireDecode(const Block& wire)
+{
+  using namespace boost::posix_time;
+
+  if (wire.type() != tlv::RepetitiveInterval)
+    BOOST_THROW_EXCEPTION(tlv::Error("Unexpected TLV type when decoding RepetitiveInterval"));
+
+  m_wire = wire;
+  m_wire.parse();
+
+  if (m_wire.elements_size() != 6)
+    BOOST_THROW_EXCEPTION(tlv::Error("RepetitiveInterval tlv does not have six sub-TLVs"));
+
+  Block::element_const_iterator it = m_wire.elements_begin();
+  // StartDate
+  if (it->type() == tlv::StartDate) {
+    m_startDate = ptime(from_iso_string(readString(*it)));
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("First element must be StartDate"));
+
+  // EndDate
+  if (it->type() == tlv::EndDate) {
+    m_endDate = ptime(from_iso_string(readString(*it)));
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("Second element must be EndDate"));
+
+  // IntervalStartHour
+  if (it->type() == tlv::IntervalStartHour) {
+    m_intervalStartHour = readNonNegativeInteger(*it);
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("Third element must be IntervalStartHour"));
+
+  // IntervalEndHour
+  if (it->type() == tlv::IntervalEndHour) {
+    m_intervalEndHour = readNonNegativeInteger(*it);
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("Fourth element must be IntervalEndHour"));
+
+  // NRepeats
+  if (it->type() == tlv::NRepeats) {
+    m_nRepeats = readNonNegativeInteger(*it);
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("Fifth element must be NRepeats"));
+
+  // RepeatUnit
+  if (it->type() == tlv::RepeatUnit) {
+    m_unit = static_cast<RepeatUnit>(readNonNegativeInteger(*it));
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("The last element must be RepeatUnit"));
+}
+
+std::tuple<bool, Interval>
+RepetitiveInterval::getInterval(const TimeStamp& tp) const
+{
+  TimeStamp startTime;
+  TimeStamp endTime;
+  bool isPositive;
+
+  if (!this->hasIntervalOnDate(tp)) {
+    // there is no interval on the date of tp
+    startTime = TimeStamp(tp.date(), boost::posix_time::hours(0));
+    endTime = TimeStamp(tp.date(), boost::posix_time::hours(24));
+    isPositive = false;
+  }
+  else {
+    // there is an interval on the date of tp
+    startTime = TimeStamp(tp.date(), boost::posix_time::hours(m_intervalStartHour));
+    endTime = TimeStamp(tp.date(), boost::posix_time::hours(m_intervalEndHour));
+
+    // check if in the time duration
+    if (tp < startTime) {
+      endTime = startTime;
+      startTime = TimeStamp(tp.date(), boost::posix_time::hours(0));
+      isPositive = false;
+    }
+    else if (tp > endTime) {
+      startTime = endTime;
+      endTime = TimeStamp(tp.date(), boost::posix_time::hours(24));
+      isPositive = false;
+    }
+    else {
+      isPositive = true;
+    }
+  }
+  return std::make_tuple(isPositive, Interval(startTime, endTime));
+}
+
+bool
+RepetitiveInterval::hasIntervalOnDate(const TimeStamp& tp) const
+{
+  namespace bg = boost::gregorian;
+
+  // check if in the bound of the interval
+  if (tp.date() < m_startDate.date() || tp.date() > m_endDate.date()) {
+    return false;
+  }
+
+  if (m_unit == RepeatUnit::NONE) {
+    return true;
+  }
+
+  // check if in the matching date
+  bg::date dateA = tp.date();
+  bg::date dateB = m_startDate.date();
+  if (m_unit == RepeatUnit::DAY) {
+    bg::date_duration duration = dateA - dateB;
+    if (static_cast<size_t>(duration.days()) % m_nRepeats == 0)
+      return true;
+  }
+  else if (m_unit == RepeatUnit::MONTH && dateA.day() == dateB.day()) {
+    size_t yearDiff = static_cast<size_t>(dateA.year() - dateB.year());
+    size_t monthDiff = 12 * yearDiff + dateA.month().as_number() - dateB.month().as_number();
+    if (monthDiff % m_nRepeats == 0)
+      return true;
+  }
+  else if (m_unit == RepeatUnit::YEAR &&
+           dateA.day().as_number() == dateB.day().as_number() &&
+           dateA.month().as_number() == dateB.month().as_number()) {
+    size_t diff = static_cast<size_t>(dateA.year() - dateB.year());
+    if (diff % m_nRepeats == 0)
+      return true;
+  }
+
+  return false;
+}
+
+bool
+RepetitiveInterval::operator<(const RepetitiveInterval& interval) const
+{
+  if (m_startDate < interval.getStartDate())
+    return true;
+  if (m_endDate < interval.getEndDate())
+    return true;
+  if (m_intervalStartHour < interval.getIntervalStartHour())
+    return true;
+  if (m_intervalEndHour < interval.getIntervalEndHour())
+    return true;
+  if (m_nRepeats < interval.getNRepeats())
+    return true;
+  if (static_cast<size_t>(m_unit) < static_cast<size_t>(interval.getRepeatUnit()))
+    return true;
+  return false;
+}
+
+} // namespace gep
+} // namespace ndn
diff --git a/src/repetitive-interval.hpp b/src/repetitive-interval.hpp
new file mode 100644
index 0000000..1e8127f
--- /dev/null
+++ b/src/repetitive-interval.hpp
@@ -0,0 +1,145 @@
+/* -*- 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 NDN_GEP_REPETITIVE_INTERVAL_HPP
+#define NDN_GEP_REPETITIVE_INTERVAL_HPP
+
+#include "common.hpp"
+#include "interval.hpp"
+
+namespace ndn {
+namespace gep {
+
+///@brief An advanced interval which can have a repeat pattern and repeat unit
+class RepetitiveInterval
+{
+public:
+  enum class RepeatUnit{
+    NONE = 0,
+    DAY = 1,
+    MONTH = 2,
+    YEAR = 3
+  };
+
+public:
+  RepetitiveInterval();
+
+  explicit
+  RepetitiveInterval(const Block& block);
+
+  /**
+   * @brief Construction to create an object
+   * @pre @p startDate <= @p endDate
+   * @pre @p intervalStartHour and @p intervalEndHour can be [0, 24]
+   * @pre @p intervalStartHour < @p intervalEndHour
+   * @pre when @p unit = NONE, then @p startDate == @p endDate
+   */
+  RepetitiveInterval(const TimeStamp& startDate,
+                     const TimeStamp& endDate,
+                     size_t intervalStartHour,
+                     size_t intervalEndHour,
+                     size_t nRepeats = 0,
+                     RepeatUnit unit = RepeatUnit::NONE);
+
+  template<encoding::Tag TAG>
+  size_t
+  wireEncode(EncodingImpl<TAG>& encoder) const;
+
+  const Block&
+  wireEncode() const;
+
+  void
+  wireDecode(const Block& wire);
+
+  /**
+   * @brief Get get an interval that @p tp falls in
+   *
+   * @parameter tp A timestamp
+   *
+   * @return bool If the repetitive interval covers the @p tp, return true, otherwise false
+   * @return Interval Return the interval which @tp falls in
+   */
+  std::tuple<bool, Interval>
+  getInterval(const TimeStamp& tp) const;
+
+  /**
+   * @brief To store in std::set, class have to implement operator <
+   *
+   * @parameter interval Interval which will be compared with
+   */
+  bool
+  operator<(const RepetitiveInterval& interval) const;
+
+  const TimeStamp&
+  getStartDate() const
+  {
+    return m_startDate;
+  }
+
+  const TimeStamp&
+  getEndDate() const
+  {
+    return m_endDate;
+  }
+
+  size_t
+  getIntervalStartHour() const
+  {
+    return m_intervalStartHour;
+  }
+
+  size_t
+  getIntervalEndHour() const
+  {
+    return m_intervalEndHour;
+  }
+
+  size_t
+  getNRepeats() const
+  {
+    return m_nRepeats;
+  }
+
+  RepeatUnit
+  getRepeatUnit() const
+  {
+    return m_unit;
+  }
+
+private:
+  ///@brief Check if there is any interval in the date of timestamp
+  bool
+  hasIntervalOnDate(const TimeStamp& tp) const;
+
+  TimeStamp m_startDate;
+  TimeStamp m_endDate;
+  size_t m_intervalStartHour;
+  size_t m_intervalEndHour;
+  size_t m_nRepeats;
+  RepeatUnit m_unit;
+
+  mutable Block m_wire;
+};
+
+} // namespace gep
+} // namespace ndn
+
+#endif // NDN_GEP_REPETITIVE_INTERVAL_HPP
diff --git a/src/schedule.cpp b/src/schedule.cpp
new file mode 100644
index 0000000..301e0fe
--- /dev/null
+++ b/src/schedule.cpp
@@ -0,0 +1,176 @@
+/* -*- 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 "schedule.hpp"
+#include "tlv.hpp"
+
+#include <ndn-cxx/encoding/block-helpers.hpp>
+#include <ndn-cxx/util/concepts.hpp>
+
+namespace ndn {
+namespace gep {
+
+BOOST_CONCEPT_ASSERT((WireEncodable<Schedule>));
+BOOST_CONCEPT_ASSERT((WireDecodable<Schedule>));
+
+Schedule::Schedule() = default;
+
+Schedule::Schedule(const Block& block)
+{
+  wireDecode(block);
+}
+
+template<encoding::Tag TAG>
+size_t
+Schedule::wireEncode(EncodingImpl<TAG>& encoder) const
+{
+  size_t totalLength = 0;
+  size_t blackLength = 0;
+  size_t whiteLength = 0;
+
+  // encode the blackIntervalList as an embed TLV structure
+  for (const RepetitiveInterval& element : m_blackIntervalList) {
+    blackLength += encoder.prependBlock(element.wireEncode());
+  }
+  blackLength += encoder.prependVarNumber(blackLength);
+  blackLength += encoder.prependVarNumber(tlv::BlackIntervalList);
+
+  // encode the whiteIntervalList as an embed TLV structure
+  for (const RepetitiveInterval& element : m_whiteIntervalList) {
+    whiteLength += encoder.prependBlock(element.wireEncode());
+  }
+  whiteLength += encoder.prependVarNumber(whiteLength);
+  whiteLength += encoder.prependVarNumber(tlv::WhiteIntervalList);
+
+  totalLength = whiteLength + blackLength;
+  totalLength += encoder.prependVarNumber(totalLength);
+  totalLength += encoder.prependVarNumber(tlv::Schedule);
+
+  return totalLength;
+}
+
+const Block&
+Schedule::wireEncode() const
+{
+  if (m_wire.hasWire())
+    return m_wire;
+
+  EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  this->m_wire = buffer.block();
+  return m_wire;
+}
+
+void
+Schedule::wireDecode(const Block& wire)
+{
+  if (wire.type() != tlv::Schedule)
+    BOOST_THROW_EXCEPTION(tlv::Error("Unexpected TLV type when decoding RepetitiveInterval"));
+
+  m_wire = wire;
+  m_wire.parse();
+
+  if (m_wire.elements_size() != 2)
+    BOOST_THROW_EXCEPTION(tlv::Error("RepetitiveInterval tlv does not have two sub-TLVs"));
+
+  Block::element_const_iterator it = m_wire.elements_begin();
+
+  if (it != m_wire.elements_end() && it->type() == tlv::WhiteIntervalList) {
+    it->parse();
+    Block::element_const_iterator tempIt = it->elements_begin();
+    while (tempIt != it->elements_end() && tempIt->type() == tlv::RepetitiveInterval) {
+      m_whiteIntervalList.insert(RepetitiveInterval(*tempIt));
+      tempIt++;
+    }
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("The first element must be WhiteIntervalList"));
+
+  if (it != m_wire.elements_end() && it->type() == tlv::BlackIntervalList) {
+    it->parse();
+    Block::element_const_iterator tempIt = it->elements_begin();
+    while (tempIt != it->elements_end() && tempIt->type() == tlv::RepetitiveInterval) {
+      m_blackIntervalList.insert(RepetitiveInterval(*tempIt));
+      tempIt++;
+    }
+    it++;
+  }
+  else
+    BOOST_THROW_EXCEPTION(tlv::Error("The second element must be BlackIntervalList"));
+}
+
+Schedule&
+Schedule::addWhiteInterval(const RepetitiveInterval& repetitiveInterval)
+{
+  m_whiteIntervalList.insert(repetitiveInterval);
+  return *this;
+}
+
+Schedule&
+Schedule::addBlackInterval(const RepetitiveInterval& repetitiveInterval)
+{
+  m_blackIntervalList.insert(repetitiveInterval);
+  return *this;
+}
+
+Interval
+Schedule::getCoveringInterval(const TimeStamp& tp) const
+{
+  Interval blackResult;
+  Interval whiteResult(true);
+  Interval tempInterval;
+  bool isPositive;
+
+  // get the blackResult
+  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);
+    }
+    else {
+      // tempInterval is not covering the time stamp, && the tempInterval to the blackResult
+      if (!blackResult.isValid())
+        blackResult = tempInterval;
+      else
+        blackResult && tempInterval;
+    }
+  }
+
+  // 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;
+    }
+  }
+
+  return whiteResult && blackResult;
+}
+
+} // namespace gep
+} // namespace ndn
diff --git a/src/schedule.hpp b/src/schedule.hpp
new file mode 100644
index 0000000..80ecb32
--- /dev/null
+++ b/src/schedule.hpp
@@ -0,0 +1,83 @@
+/* -*- 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 NDN_GEP_SECHEDULE_HPP
+#define NDN_GEP_SECHEDULE_HPP
+
+#include "common.hpp"
+#include "repetitive-interval.hpp"
+
+namespace ndn {
+namespace gep {
+
+/**
+ * @brief Schedule is used to manage the time, which contains two sets of RepetitiveIntervals
+ *
+ * whiteIntervalList is used to define the time allowing member's access to data
+ * blackIntervalList is used to define the time not allowing member's access to data
+ */
+class Schedule
+{
+public:
+  Schedule();
+
+  explicit
+  Schedule(const Block& block);
+
+public:
+  template<encoding::Tag TAG>
+  size_t
+  wireEncode(EncodingImpl<TAG>& encoder) const;
+
+  const Block&
+  wireEncode() const;
+
+  void
+  wireDecode(const Block& wire);
+
+  ///@brief Add an RepetitiveInterval @p repetitiveInterval into white list
+  Schedule&
+  addWhiteInterval(const RepetitiveInterval& repetitiveInterval);
+
+  ///@brief Add the RepetitiveInterval into black list
+  Schedule&
+  addBlackInterval(const RepetitiveInterval& repetitiveInterval);
+
+  /**
+   * @brief Get the Interval that covers the @p ts
+   *
+   * Function iterates two repetitive interval sets and find out
+   * the shortest interval that allows group member to have the access to the data
+   */
+  Interval
+  getCoveringInterval(const TimeStamp& ts) const;
+
+private:
+  std::set<RepetitiveInterval> m_whiteIntervalList;
+  std::set<RepetitiveInterval> m_blackIntervalList;
+
+  mutable Block m_wire;
+};
+
+} // namespace gep
+} // namespace ndn
+
+#endif // NDN_GROUP_ENCRYPT_SECHEDULE_HPP
diff --git a/src/tlv.hpp b/src/tlv.hpp
index a94af47..5c0c6ef 100644
--- a/src/tlv.hpp
+++ b/src/tlv.hpp
@@ -30,7 +30,21 @@
   EncryptedContent = 130,
   EncryptionAlgorithm = 131,
   EncryptedPayload = 132,
-  InitialVector = 133
+  InitialVector = 133,
+
+  // for repetitive interval
+  StartDate = 134,
+  EndDate = 135,
+  IntervalStartHour = 136,
+  IntervalEndHour = 137,
+  NRepeats = 138,
+  RepeatUnit = 139,
+  RepetitiveInterval = 140,
+
+  // for schedule
+  WhiteIntervalList = 141,
+  BlackIntervalList = 142,
+  Schedule = 143
 };
 
 enum AlgorithmTypeValue {
diff --git a/tests/unit-tests/interval.t.cpp b/tests/unit-tests/interval.t.cpp
new file mode 100644
index 0000000..e9cf6d9
--- /dev/null
+++ b/tests/unit-tests/interval.t.cpp
@@ -0,0 +1,155 @@
+/* -*- 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 "interval.hpp"
+#include "boost-test.hpp"
+
+namespace ndn {
+namespace gep {
+namespace tests {
+
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE(TestInterval)
+
+BOOST_AUTO_TEST_CASE(Construction)
+{
+  // construct with the right parameters
+  Interval interval1(from_iso_string("20150825T120000"),
+                     from_iso_string("20150825T160000"));
+  BOOST_CHECK_EQUAL(to_iso_string(interval1.getStartTime()), "20150825T120000");
+  BOOST_CHECK_EQUAL(to_iso_string(interval1.getEndTime()), "20150825T160000");
+  BOOST_CHECK_EQUAL(interval1.isValid(), true);
+
+  // construct with the invalid interval
+  Interval interval2;
+  BOOST_CHECK_EQUAL(interval2.isValid(), false);
+
+  // construct with the empty interval
+  Interval interval3(true);
+  BOOST_CHECK_EQUAL(interval3.isValid(), true);
+  BOOST_CHECK_EQUAL(interval3.isEmpty(), true);
+}
+
+BOOST_AUTO_TEST_CASE(CoverTimePoint)
+{
+  Interval interval(from_iso_string("20150825T120000"),
+                    from_iso_string("20150825T160000"));
+
+  TimeStamp tp1 = from_iso_string("20150825T120000");
+  TimeStamp tp2 = from_iso_string("20150825T130000");
+  TimeStamp tp3 = from_iso_string("20150825T170000");
+  TimeStamp tp4 = from_iso_string("20150825T110000");
+
+  BOOST_CHECK_EQUAL(interval.covers(tp1), true);
+  BOOST_CHECK_EQUAL(interval.covers(tp2), true);
+  BOOST_CHECK_EQUAL(interval.covers(tp3), false);
+  BOOST_CHECK_EQUAL(interval.covers(tp4), false);
+}
+
+BOOST_AUTO_TEST_CASE(IntersectionAndUnion)
+{
+  Interval interval1(from_iso_string("20150825T030000"),
+                     from_iso_string("20150825T050000"));
+  // no intersection
+  Interval interval2(from_iso_string("20150825T050000"),
+                     from_iso_string("20150825T070000"));
+  // no intersection
+  Interval interval3(from_iso_string("20150825T060000"),
+                     from_iso_string("20150825T070000"));
+  // there's an intersection
+  Interval interval4(from_iso_string("20150825T010000"),
+                     from_iso_string("20150825T040000"));
+  // right in the interval1, there's an intersection
+  Interval interval5(from_iso_string("20150825T030000"),
+                     from_iso_string("20150825T040000"));
+  // wrap the interval1, there's an intersection
+  Interval interval6(from_iso_string("20150825T010000"),
+                     from_iso_string("20150825T050000"));
+  // empty interval
+  Interval interval7(true);
+
+  Interval tempInterval = interval1;
+  tempInterval && interval2;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), true);
+
+  tempInterval = interval1;
+  BOOST_CHECK_THROW(tempInterval || interval2, Interval::Error);
+
+  tempInterval = interval1;
+  tempInterval && interval3;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), true);
+
+  tempInterval = interval1;
+  BOOST_CHECK_THROW(tempInterval || interval3, Interval::Error);
+
+  tempInterval = interval1;
+  tempInterval && interval4;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T030000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T040000");
+
+  tempInterval = interval1;
+  tempInterval || interval4;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T010000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T050000");
+
+  tempInterval = interval1;
+  tempInterval && interval5;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T030000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T040000");
+
+  tempInterval = interval1;
+  tempInterval || interval5;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T030000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T050000");
+
+  tempInterval = interval1;
+  tempInterval && interval6;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T030000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T050000");
+
+  tempInterval = interval1;
+  tempInterval || interval6;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T010000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T050000");
+
+  tempInterval = interval1;
+  tempInterval && interval7;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), true);
+
+  tempInterval = interval1;
+  tempInterval || interval7;
+  BOOST_CHECK_EQUAL(tempInterval.isEmpty(), false);
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getStartTime()), "20150825T030000");
+  BOOST_CHECK_EQUAL(to_iso_string(tempInterval.getEndTime()), "20150825T050000");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace gep
+} // namespace ndn
diff --git a/tests/unit-tests/repetitive-interval.t.cpp b/tests/unit-tests/repetitive-interval.t.cpp
new file mode 100644
index 0000000..65ac8ae
--- /dev/null
+++ b/tests/unit-tests/repetitive-interval.t.cpp
@@ -0,0 +1,207 @@
+/* -*- 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 "repetitive-interval.hpp"
+#include "boost-test.hpp"
+
+namespace ndn {
+namespace gep {
+namespace tests {
+
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE(TestRepetitiveInterval)
+
+BOOST_AUTO_TEST_CASE(Construction)
+{
+  RepetitiveInterval repetitiveInterval1(from_iso_string("20150825T000000"),
+                                         from_iso_string("20150825T000000"),
+                                         5, 10);
+
+  BOOST_CHECK_EQUAL(to_iso_string(repetitiveInterval1.getStartDate()), "20150825T000000");
+  BOOST_CHECK_EQUAL(to_iso_string(repetitiveInterval1.getEndDate()), "20150825T000000");
+  BOOST_CHECK_EQUAL(repetitiveInterval1.getIntervalStartHour(), 5);
+  BOOST_CHECK_EQUAL(repetitiveInterval1.getIntervalEndHour(), 10);
+
+  RepetitiveInterval repetitiveInterval2(from_iso_string("20150825T000000"),
+                                         from_iso_string("20150827T000000"),
+                                         5, 10, 1, RepetitiveInterval::RepeatUnit::DAY);
+
+  BOOST_CHECK_EQUAL(repetitiveInterval2.getNRepeats(), 1);
+  BOOST_CHECK(repetitiveInterval2.getRepeatUnit() == RepetitiveInterval::RepeatUnit::DAY);
+
+  RepetitiveInterval repetitiveInterval3(from_iso_string("20150825T000000"),
+                                         from_iso_string("20151227T000000"),
+                                         5, 10, 2, RepetitiveInterval::RepeatUnit::MONTH);
+
+  BOOST_CHECK_EQUAL(repetitiveInterval3.getNRepeats(), 2);
+  BOOST_CHECK(repetitiveInterval3.getRepeatUnit() == RepetitiveInterval::RepeatUnit::MONTH);
+
+  RepetitiveInterval repetitiveInterval4(from_iso_string("20150825T000000"),
+                                         from_iso_string("20301227T000000"),
+                                         5, 10, 5, RepetitiveInterval::RepeatUnit::YEAR);
+
+  BOOST_CHECK_EQUAL(repetitiveInterval4.getNRepeats(), 5);
+  BOOST_CHECK(repetitiveInterval4.getRepeatUnit() == RepetitiveInterval::RepeatUnit::YEAR);
+
+  RepetitiveInterval repetitiveInterval5;
+
+  BOOST_CHECK_EQUAL(repetitiveInterval5.getNRepeats(), 0);
+  BOOST_CHECK(repetitiveInterval5.getRepeatUnit() == RepetitiveInterval::RepeatUnit::NONE);
+}
+
+BOOST_AUTO_TEST_CASE(CheckCoverTimePoint)
+{
+  ///////////////////////////////////////////// with the repeat unit DAY
+
+  RepetitiveInterval repetitiveInterval1(from_iso_string("20150825T000000"),
+                                         from_iso_string("20150925T000000"),
+                                         5, 10, 2, RepetitiveInterval::RepeatUnit::DAY);
+  Interval resultInterval;
+  bool isPositive = false;
+
+  TimeStamp tp1 = from_iso_string("20150825T050000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval1.getInterval(tp1);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
+
+  TimeStamp tp2 = from_iso_string("20150902T060000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval1.getInterval(tp2);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150902T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150902T100000");
+
+  TimeStamp tp3 = from_iso_string("20150929T040000");
+
+  BOOST_CHECK(std::get<0>(repetitiveInterval1.getInterval(tp3)) == false);
+
+  ///////////////////////////////////////////// with the repeat unit MONTH
+
+  RepetitiveInterval repetitiveInterval2(from_iso_string("20150825T000000"),
+                                         from_iso_string("20160825T000000"),
+                                         5, 10, 2, RepetitiveInterval::RepeatUnit::MONTH);
+
+  TimeStamp tp4 = from_iso_string("20150825T050000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval2.getInterval(tp4);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
+
+  TimeStamp tp5 = from_iso_string("20151025T060000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval2.getInterval(tp5);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20151025T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()),  "20151025T100000");
+
+  TimeStamp tp6 = from_iso_string("20151226T050000");
+
+  BOOST_CHECK(std::get<0>(repetitiveInterval2.getInterval(tp6)) == false);
+
+  TimeStamp tp7 = from_iso_string("20151225T040000");
+
+  BOOST_CHECK(std::get<0>(repetitiveInterval2.getInterval(tp7)) == false);
+
+  ///////////////////////////////////////////// with the repeat unit YEAR
+
+  RepetitiveInterval repetitiveInterval3(from_iso_string("20150825T000000"),
+                                         from_iso_string("20300825T000000"),
+                                         5, 10, 3, RepetitiveInterval::RepeatUnit::YEAR);
+
+  TimeStamp tp8 = from_iso_string("20150825T050000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval3.getInterval(tp8);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150825T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150825T100000");
+
+  TimeStamp tp9 = from_iso_string("20180825T060000");
+
+  std::tie(isPositive,resultInterval) = repetitiveInterval3.getInterval(tp9);
+  BOOST_CHECK_EQUAL(isPositive, true);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20180825T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20180825T100000");
+
+  TimeStamp tp10 = from_iso_string("20180826T050000");
+  BOOST_CHECK(std::get<0>(repetitiveInterval3.getInterval(tp10)) == false);
+
+  TimeStamp tp11 = from_iso_string("20210825T040000");
+  BOOST_CHECK(std::get<0>(repetitiveInterval3.getInterval(tp11)) == false);
+
+  TimeStamp tp12 = from_iso_string("20300825T040000");
+  BOOST_CHECK(std::get<0>(repetitiveInterval3.getInterval(tp12)) == false);
+}
+
+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,
+      0x05,
+    0x89, 0x01,
+      0x0a,
+    0x8a, 0x01,
+      0x04,
+    0x8b, 0x01,
+      0x01
+};
+
+BOOST_AUTO_TEST_CASE(EncodeAndDecode)
+{
+  RepetitiveInterval repetitiveInterval1(from_iso_string("20150825T000000"),
+                                         from_iso_string("20150921T000000"),
+                                         5, 10, 4, RepetitiveInterval::RepeatUnit::DAY);
+
+  Block block1 = repetitiveInterval1.wireEncode();
+  Block block2(REPETITIVE_INTERVAL, sizeof(REPETITIVE_INTERVAL));
+
+  BOOST_CHECK(block1 == block2);
+
+  RepetitiveInterval RepetitiveInterval2(block1);
+
+  BOOST_CHECK_EQUAL(to_iso_string(RepetitiveInterval2.getStartDate()), "20150825T000000");
+  BOOST_CHECK_EQUAL(to_iso_string(RepetitiveInterval2.getEndDate()), "20150921T000000");
+  BOOST_CHECK_EQUAL(RepetitiveInterval2.getIntervalStartHour(), 5);
+  BOOST_CHECK_EQUAL(RepetitiveInterval2.getIntervalEndHour(), 10);
+  BOOST_CHECK_EQUAL(RepetitiveInterval2.getNRepeats(), 4);
+  BOOST_CHECK(RepetitiveInterval2.getRepeatUnit() == RepetitiveInterval::RepeatUnit::DAY);
+
+  RepetitiveInterval repetitiveInterval3(block2);
+
+  BOOST_CHECK_EQUAL(to_iso_string(repetitiveInterval3.getStartDate()), "20150825T000000");
+  BOOST_CHECK_EQUAL(to_iso_string(repetitiveInterval3.getEndDate()), "20150921T000000");
+  BOOST_CHECK_EQUAL(repetitiveInterval3.getIntervalStartHour(), 5);
+  BOOST_CHECK_EQUAL(repetitiveInterval3.getIntervalEndHour(), 10);
+  BOOST_CHECK_EQUAL(repetitiveInterval3.getNRepeats(), 4);
+  BOOST_CHECK(repetitiveInterval3.getRepeatUnit() == RepetitiveInterval::RepeatUnit::DAY);
+}
+
+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
new file mode 100644
index 0000000..80560c5
--- /dev/null
+++ b/tests/unit-tests/schedule.t.cpp
@@ -0,0 +1,211 @@
+/* -*- 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 "schedule.hpp"
+#include "boost-test.hpp"
+
+namespace ndn {
+namespace gep {
+namespace tests {
+
+using namespace boost::posix_time;
+
+BOOST_AUTO_TEST_SUITE(TestSchedule)
+
+BOOST_AUTO_TEST_CASE(CalculateCoveringInterval)
+{
+  Schedule schedule;
+
+  RepetitiveInterval interval1(from_iso_string("20150825T000000"),
+                               from_iso_string("20150828T000000"),
+                               5, 10, 2, RepetitiveInterval::RepeatUnit::DAY);
+  RepetitiveInterval interval2(from_iso_string("20150825T000000"),
+                               from_iso_string("20150828T000000"),
+                               6, 8, 1, RepetitiveInterval::RepeatUnit::DAY);
+  RepetitiveInterval interval3(from_iso_string("20150827T000000"),
+                               from_iso_string("20150827T000000"),
+                               7, 8);
+  RepetitiveInterval interval4(from_iso_string("20150825T000000"),
+                               from_iso_string("20150825T000000"),
+                               4, 7);
+
+  schedule.addWhiteInterval(interval1);
+  schedule.addWhiteInterval(interval2);
+  schedule.addWhiteInterval(interval4);
+  schedule.addBlackInterval(interval3);
+
+  Interval resultInterval;
+
+  // tp1 --> 8.25 4-10
+  TimeStamp tp1 = from_iso_string("20150825T063000");
+  resultInterval = schedule.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
+  TimeStamp tp2 = from_iso_string("20150826T073000");
+  resultInterval = schedule.getCoveringInterval(tp2);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150826T060000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T080000");
+
+  // tp3 --> 8.27 5-7
+  TimeStamp tp3 = from_iso_string("20150827T053000");
+  resultInterval = schedule.getCoveringInterval(tp3);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150827T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150827T070000");
+
+  // tp4 --> 8.27 5-7
+  TimeStamp tp4 = from_iso_string("20150827T063000");
+  resultInterval = schedule.getCoveringInterval(tp4);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150827T050000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150827T070000");
+
+  // tp5 --> No
+  TimeStamp tp5 = from_iso_string("20150827T073000");
+  BOOST_CHECK_EQUAL(schedule.getCoveringInterval(tp5).isEmpty(), true);
+
+  // tp6 --> No
+  TimeStamp tp6 = from_iso_string("20150825T113000");
+  BOOST_CHECK_EQUAL(schedule.getCoveringInterval(tp6).isEmpty(), true);
+}
+
+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
+};
+
+BOOST_AUTO_TEST_CASE(EncodeAndDecode)
+{
+  Schedule schedule;
+
+  RepetitiveInterval interval1(from_iso_string("20150825T000000"),
+                               from_iso_string("20150828T000000"),
+                               5, 10, 2, RepetitiveInterval::RepeatUnit::DAY);
+  RepetitiveInterval interval2(from_iso_string("20150825T000000"),
+                               from_iso_string("20150828T000000"),
+                               6, 8, 1, RepetitiveInterval::RepeatUnit::DAY);
+  RepetitiveInterval interval3(from_iso_string("20150827T000000"),
+                               from_iso_string("20150827T000000"),
+                               7, 8);
+  RepetitiveInterval interval4(from_iso_string("20150825T000000"),
+                               from_iso_string("20150825T000000"),
+                               4, 7);
+
+  schedule.addWhiteInterval(interval1);
+  schedule.addWhiteInterval(interval2);
+  schedule.addWhiteInterval(interval4);
+  schedule.addBlackInterval(interval3);
+
+  Block block = schedule.wireEncode();
+  Block block2(SCHEDULE, sizeof(SCHEDULE));
+  BOOST_CHECK(block == block2);
+
+  Schedule schedule2(block);
+  Interval resultInterval;
+
+  // tp1 --> 8.25 4-10
+  TimeStamp tp1 = from_iso_string("20150825T063000");
+  resultInterval = schedule2.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
+  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);
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getStartTime()), "20150826T060000");
+  BOOST_CHECK_EQUAL(to_iso_string(resultInterval.getEndTime()), "20150826T080000");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace gep
+} // namespace ndn
