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
