diff --git a/src/handles/base-handle.hpp b/src/handles/base-handle.hpp
index 9427356..44ac4a8 100644
--- a/src/handles/base-handle.hpp
+++ b/src/handles/base-handle.hpp
@@ -110,10 +110,10 @@
 inline void
 BaseHandle::reply(const Interest& commandInterest, const RepoCommandResponse& response)
 {
-  Data rdata(commandInterest.getName());
-  rdata.setContent(response.wireEncode());
-  m_keyChain.sign(rdata);
-  m_face.put(rdata);
+  shared_ptr<Data> rdata = make_shared<Data>(commandInterest.getName());
+  rdata->setContent(response.wireEncode());
+  m_keyChain.sign(*rdata);
+  m_face.put(*rdata);
 }
 
 inline void
diff --git a/src/handles/watch-handle.cpp b/src/handles/watch-handle.cpp
new file mode 100644
index 0000000..15a82fa
--- /dev/null
+++ b/src/handles/watch-handle.cpp
@@ -0,0 +1,379 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  Regents of the University of California.
+ *
+ * This file is part of NDN repo-ng (Next generation of NDN repository).
+ * See AUTHORS.md for complete list of repo-ng authors and contributors.
+ *
+ * repo-ng 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.
+ *
+ * repo-ng 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
+ * repo-ng, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "watch-handle.hpp"
+
+namespace repo {
+
+static const milliseconds PROCESS_DELETE_TIME(10000);
+static const milliseconds DEFAULT_INTEREST_LIFETIME(4000);
+
+WatchHandle::WatchHandle(Face& face, RepoStorage& storageHandle, KeyChain& keyChain,
+                         Scheduler& scheduler, ValidatorConfig& validator)
+  : BaseHandle(face, storageHandle, keyChain, scheduler)
+  , m_validator(validator)
+  , m_interestNum(0)
+  , m_maxInterestNum(0)
+  , m_interestLifetime(DEFAULT_INTEREST_LIFETIME)
+  , m_watchTimeout(0)
+  , m_startTime(steady_clock::now())
+  , m_size(0)
+{
+}
+
+void
+WatchHandle::deleteProcess(const Name& name)
+{
+  m_processes.erase(name);
+}
+
+// Interest.
+void
+WatchHandle::onInterest(const Name& prefix, const Interest& interest)
+{
+  m_validator.validate(interest,
+                       bind(&WatchHandle::onValidated, this, _1, prefix),
+                       bind(&WatchHandle::onValidationFailed, this, _1, _2));
+}
+
+void
+WatchHandle::onRegistered(const Name& prefix)
+{
+  getFace().setInterestFilter(Name().append(prefix).append("start"),
+                              bind(&WatchHandle::onInterest, this, _1, _2));
+  getFace().setInterestFilter(Name().append(prefix).append("check"),
+                              bind(&WatchHandle::onCheckInterest, this, _1, _2));
+  getFace().setInterestFilter(Name().append(prefix).append("stop"),
+                              bind(&WatchHandle::onStopInterest, this, _1, _2));
+}
+
+// onRegisterFailed for watch start.
+void
+WatchHandle::onRegisterFailed(const Name& prefix, const std::string& reason)
+{
+  std::cerr << reason << std::endl;
+  throw Error("watch prefix registration failed");
+}
+
+void
+WatchHandle::onValidated(const shared_ptr<const Interest>& interest, const Name& prefix)
+{
+  RepoCommandParameter parameter;
+  try {
+    extractParameter(*interest, prefix, parameter);
+  }
+  catch (RepoCommandParameter::Error) {
+    negativeReply(*interest, 403);
+    return;
+  }
+
+  processWatchCommand(*interest, parameter);
+}
+
+void WatchHandle::watchStop(const Name& name)
+{
+  m_processes[name].second = false;
+  m_maxInterestNum = 0;
+  m_interestNum = 0;
+  m_startTime = steady_clock::now();
+  m_watchTimeout = milliseconds(0);
+  m_interestLifetime = DEFAULT_INTEREST_LIFETIME;
+  m_size = 0;
+}
+
+void
+WatchHandle::onValidationFailed(const shared_ptr<const Interest>& interest, const string& reason)
+{
+  std::cerr << reason << std::endl;
+  negativeReply(*interest, 401);
+}
+
+void
+WatchHandle::onData(const Interest& interest, ndn::Data& data, const Name& name)
+{
+  m_validator.validate(data,
+                       bind(&WatchHandle::onDataValidated, this, interest, _1, name),
+                       bind(&WatchHandle::onDataValidationFailed, this, interest, _1, _2, name));
+}
+
+void
+WatchHandle::onDataValidated(const Interest& interest, const shared_ptr<const Data>& data,
+                             const Name& name)
+{
+  if (!m_processes[name].second) {
+    return;
+  }
+  if (getStorageHandle().insertData(*data)) {
+    m_size++;
+    if (!onRunning(name))
+      return;
+
+    Interest fetchInterest(interest.getName());
+    fetchInterest.setSelectors(interest.getSelectors());
+    fetchInterest.setInterestLifetime(m_interestLifetime);
+    fetchInterest.setChildSelector(1);
+
+    // update selectors
+    // if data name is equal to interest name, use MinSuffixComponents selecor to exclude this data
+    if (data->getName().size() == interest.getName().size()) {
+      fetchInterest.setMinSuffixComponents(2);
+    }
+    else {
+      Exclude exclude;
+      if (!interest.getExclude().empty()) {
+        exclude = interest.getExclude();
+      }
+
+      exclude.excludeBefore(data->getName()[interest.getName().size()]);
+      fetchInterest.setExclude(exclude);
+    }
+
+    ++m_interestNum;
+    getFace().expressInterest(fetchInterest,
+                              bind(&WatchHandle::onData, this, _1, _2, name),
+                              bind(&WatchHandle::onTimeout, this, _1, name));
+  }
+  else {
+    throw Error("Insert into Repo Failed");
+  }
+  m_processes[name].first.setInsertNum(m_size);
+}
+
+void
+WatchHandle::onDataValidationFailed(const Interest& interest, const shared_ptr<const Data>& data,
+                                    const std::string& reason, const Name& name)
+{
+  std::cerr << reason << std::endl;
+  if (!m_processes[name].second) {
+    return;
+  }
+  if (!onRunning(name))
+    return;
+
+  Interest fetchInterest(interest.getName());
+  fetchInterest.setSelectors(interest.getSelectors());
+  fetchInterest.setInterestLifetime(m_interestLifetime);
+  fetchInterest.setChildSelector(1);
+
+  // update selectors
+  // if data name is equal to interest name, use MinSuffixComponents selecor to exclude this data
+  if (data->getName().size() == interest.getName().size()) {
+    fetchInterest.setMinSuffixComponents(2);
+  }
+  else {
+    Exclude exclude;
+    if (!interest.getExclude().empty()) {
+      exclude = interest.getExclude();
+    }
+    // Only exclude this data since other data whose names are smaller may be validated and satisfied
+    exclude.excludeBefore(data->getName()[interest.getName().size()]);
+    fetchInterest.setExclude(exclude);
+  }
+
+  ++m_interestNum;
+  getFace().expressInterest(fetchInterest,
+                            bind(&WatchHandle::onData, this, _1, _2, name),
+                            bind(&WatchHandle::onTimeout, this, _1, name));
+}
+
+void
+WatchHandle::onTimeout(const ndn::Interest& interest, const Name& name)
+{
+  std::cerr << "Timeout" << std::endl;
+  if (!m_processes[name].second) {
+    return;
+  }
+  if (!onRunning(name))
+    return;
+  // selectors do not need to be updated
+  Interest fetchInterest(interest.getName());
+  fetchInterest.setSelectors(interest.getSelectors());
+  fetchInterest.setInterestLifetime(m_interestLifetime);
+  fetchInterest.setChildSelector(1);
+
+  ++m_interestNum;
+  getFace().expressInterest(fetchInterest,
+                            bind(&WatchHandle::onData, this, _1, _2, name),
+                            bind(&WatchHandle::onTimeout, this, _1, name));
+
+}
+
+void
+WatchHandle::listen(const Name& prefix)
+{
+  Name baseWatchPrefix(prefix);
+  baseWatchPrefix.append("watch");
+  getFace().registerPrefix(baseWatchPrefix,
+                           bind(&WatchHandle::onRegistered, this, _1),
+                           bind(&WatchHandle::onRegisterFailed, this, _1, _2));
+}
+
+void
+WatchHandle::onStopInterest(const Name& prefix, const Interest& interest)
+{
+  m_validator.validate(interest,
+                       bind(&WatchHandle::onStopValidated, this, _1, prefix),
+                       bind(&WatchHandle::onStopValidationFailed, this, _1, _2));
+}
+
+void
+WatchHandle::onStopValidated(const shared_ptr<const Interest>& interest, const Name& prefix)
+{
+  RepoCommandParameter parameter;
+  try {
+    extractParameter(*interest, prefix, parameter);
+  }
+  catch (RepoCommandParameter::Error) {
+    negativeReply(*interest, 403);
+    return;
+  }
+
+  watchStop(parameter.getName());
+  negativeReply(*interest, 101);
+}
+
+void
+WatchHandle::onStopValidationFailed(const shared_ptr<const Interest>& interest,
+                                    const std::string& reason)
+{
+  std::cerr << reason << std::endl;
+  negativeReply(*interest, 401);
+}
+
+void
+WatchHandle::onCheckInterest(const Name& prefix, const Interest& interest)
+{
+  m_validator.validate(interest,
+                       bind(&WatchHandle::onCheckValidated, this, _1, prefix),
+                       bind(&WatchHandle::onCheckValidationFailed, this, _1, _2));
+}
+
+void
+WatchHandle::onCheckValidated(const shared_ptr<const Interest>& interest, const Name& prefix)
+{
+  RepoCommandParameter parameter;
+  try {
+    extractParameter(*interest, prefix, parameter);
+  }
+  catch (RepoCommandParameter::Error) {
+    negativeReply(*interest, 403);
+    return;
+  }
+
+  if (!parameter.hasName()) {
+    negativeReply(*interest, 403);
+    return;
+  }
+  //check whether this process exists
+  Name name = parameter.getName();
+  if (m_processes.count(name) == 0) {
+    std::cerr << "no such process name: " << name << std::endl;
+    negativeReply(*interest, 404);
+    return;
+  }
+
+  RepoCommandResponse& response = m_processes[name].first;
+    if (!m_processes[name].second) {
+    response.setStatusCode(101);
+  }
+
+  reply(*interest, response);
+
+}
+
+void
+WatchHandle::onCheckValidationFailed(const shared_ptr<const Interest>& interest,
+                                     const std::string& reason)
+{
+  std::cerr << reason << std::endl;
+  negativeReply(*interest, 401);
+}
+
+void
+WatchHandle::deferredDeleteProcess(const Name& name)
+{
+  getScheduler().scheduleEvent(PROCESS_DELETE_TIME,
+                               ndn::bind(&WatchHandle::deleteProcess, this, name));
+}
+
+void
+WatchHandle::processWatchCommand(const Interest& interest,
+                                 RepoCommandParameter& parameter)
+{
+  // if there is no watchTimeout specified, m_watchTimeout will be set as 0 and this handle will run forever
+  if (parameter.hasWatchTimeout()) {
+    m_watchTimeout = parameter.getWatchTimeout();
+  }
+  else {
+    m_watchTimeout = milliseconds(0);
+  }
+
+  // if there is no maxInterestNum specified, m_maxInterestNum will be 0, which means infinity
+  if (parameter.hasMaxInterestNum()) {
+    m_maxInterestNum = parameter.getMaxInterestNum();
+  }
+  else {
+    m_maxInterestNum = 0;
+  }
+
+  if (parameter.hasInterestLifetime()) {
+    m_interestLifetime = parameter.getInterestLifetime();
+  }
+
+  reply(interest, RepoCommandResponse().setStatusCode(100));
+
+  m_processes[parameter.getName()] =
+                std::make_pair(RepoCommandResponse().setStatusCode(300), true);
+  Interest fetchInterest(parameter.getName());
+  if (parameter.hasSelectors()) {
+    fetchInterest.setSelectors(parameter.getSelectors());
+  }
+  fetchInterest.setChildSelector(1);
+  fetchInterest.setInterestLifetime(m_interestLifetime);
+  m_startTime = steady_clock::now();
+  m_interestNum++;
+  getFace().expressInterest(fetchInterest,
+                            bind(&WatchHandle::onData, this, _1, _2, parameter.getName()),
+                            bind(&WatchHandle::onTimeout, this, _1, parameter.getName()));
+}
+
+
+void
+WatchHandle::negativeReply(const Interest& interest, int statusCode)
+{
+  RepoCommandResponse response;
+  response.setStatusCode(statusCode);
+  reply(interest, response);
+}
+
+bool
+WatchHandle::onRunning(const Name& name)
+{
+  bool isTimeout = (m_watchTimeout != milliseconds::zero() &&
+                    steady_clock::now() - m_startTime > m_watchTimeout);
+  bool isMaxInterest = m_interestNum >= m_maxInterestNum && m_maxInterestNum != 0;
+  if (isTimeout || isMaxInterest) {
+    deferredDeleteProcess(name);
+    watchStop(name);
+    return false;
+  }
+  return true;
+}
+
+} //namespace repo
diff --git a/src/handles/watch-handle.hpp b/src/handles/watch-handle.hpp
new file mode 100644
index 0000000..10cddda
--- /dev/null
+++ b/src/handles/watch-handle.hpp
@@ -0,0 +1,170 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  Regents of the University of California.
+ *
+ * This file is part of NDN repo-ng (Next generation of NDN repository).
+ * See AUTHORS.md for complete list of repo-ng authors and contributors.
+ *
+ * repo-ng 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.
+ *
+ * repo-ng 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
+ * repo-ng, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef REPO_HANDLES_WATCH_HANDLE_HPP
+#define REPO_HANDLES_WATCH_HANDLE_HPP
+
+#include "base-handle.hpp"
+
+#include <queue>
+
+namespace repo {
+
+using std::map;
+using std::pair;
+using std::queue;
+using namespace ndn::time;
+/**
+ * @brief WatchHandle provides a different way for repo to insert data.
+ *
+ * Repo keeps sending interest to request the data with same prefix,
+ *
+ * but with different exclude selectors(updated every time). Repo will stop
+ *
+ * watching the prefix until a command interest tell it to stop, the total
+ *
+ * amount of sent interests reaches a specific number or time out.
+ */
+class WatchHandle : public BaseHandle
+{
+
+public:
+  class Error : public BaseHandle::Error
+  {
+  public:
+    explicit
+    Error(const std::string& what)
+      : BaseHandle::Error(what)
+    {
+    }
+  };
+
+
+public:
+  WatchHandle(Face& face, RepoStorage& storageHandle, KeyChain& keyChain,
+              Scheduler& scheduler, ValidatorConfig& validator);
+
+  virtual void
+  listen(const Name& prefix);
+
+private: // watch-insert command
+  /**
+   * @brief handle watch commands
+   */
+  void
+  onInterest(const Name& prefix, const Interest& interest);
+
+  void
+  onValidated(const shared_ptr<const Interest>& interest, const Name& prefix);
+
+  void
+  onValidationFailed(const shared_ptr<const Interest>& interest, const string& reason);
+
+  void
+  onRegistered(const Name& prefix);
+
+  void
+  onRegisterFailed(const Name& prefix, const std::string& reason);
+
+private: // data fetching
+  /**
+   * @brief fetch data and send next interest
+   */
+  void
+  onData(const Interest& interest, Data& data, const Name& name);
+
+  /**
+   * @brief handle when fetching one data timeout
+   */
+  void
+  onTimeout(const Interest& interest, const Name& name);
+
+  void
+  onDataValidated(const Interest& interest, const shared_ptr<const Data>& data,
+                  const Name& name);
+
+  /**
+   * @brief failure of validation
+   */
+  void
+  onDataValidationFailed(const Interest& interest, const shared_ptr<const Data>& data,
+                         const std::string& reason, const Name& name);
+
+
+  void
+  processWatchCommand(const Interest& interest, RepoCommandParameter& parameter);
+
+  void
+  watchStop(const Name& name);
+
+private: // watch state check command
+  /**
+   * @brief handle watch check command
+   */
+  void
+  onCheckInterest(const Name& prefix, const Interest& interest);
+
+  void
+  onCheckValidated(const shared_ptr<const Interest>& interest, const Name& prefix);
+
+  void
+  onCheckValidationFailed(const shared_ptr<const Interest>& interest, const std::string& reason);
+
+private: // watch stop command
+  /**
+   * @brief handle watch stop command
+   */
+  void
+  onStopInterest(const Name& prefix, const Interest& interest);
+
+  void
+  onStopValidated(const shared_ptr<const Interest>& interest, const Name& prefix);
+
+  void
+  onStopValidationFailed(const shared_ptr<const Interest>& interest, const std::string& reason);
+
+private:
+  void
+  negativeReply(const Interest& interest, int statusCode);
+
+  void
+  deferredDeleteProcess(const Name& name);
+
+  void
+  deleteProcess(const Name& name);
+
+  bool
+  onRunning(const Name& name);
+
+private:
+
+  ValidatorConfig& m_validator;
+
+  map<Name, std::pair<RepoCommandResponse, bool> > m_processes;
+  int64_t m_interestNum;
+  int64_t m_maxInterestNum;
+  milliseconds m_interestLifetime;
+  milliseconds m_watchTimeout;
+  ndn::time::steady_clock::TimePoint m_startTime;
+  int64_t m_size;
+};
+
+} // namespace repo
+
+#endif // REPO_HANDLES_Watch_HANDLE_HPP
diff --git a/src/handles/write-handle.cpp b/src/handles/write-handle.cpp
index 65098bf..0bc4e12 100644
--- a/src/handles/write-handle.cpp
+++ b/src/handles/write-handle.cpp
@@ -20,11 +20,13 @@
 #include "write-handle.hpp"
 
 namespace repo {
+using namespace ndn::time;
 
 static const int RETRY_TIMEOUT = 3;
 static const int DEFAULT_CREDIT = 12;
-static const ndn::time::milliseconds NOEND_TIMEOUT(10000);
-static const ndn::time::milliseconds PROCESS_DELETE_TIME(10000);
+static const milliseconds NOEND_TIMEOUT(10000);
+static const milliseconds PROCESS_DELETE_TIME(10000);
+static const milliseconds DEFAULT_INTEREST_LIFETIME(4000);
 
 WriteHandle::WriteHandle(Face& face, RepoStorage& storageHandle, KeyChain& keyChain,
                          Scheduler& scheduler,// RepoStorage& storeindex,
@@ -34,6 +36,7 @@
   , m_retryTime(RETRY_TIMEOUT)
   , m_credit(DEFAULT_CREDIT)
   , m_noEndTimeout(NOEND_TIMEOUT)
+  , m_interestLifetime(DEFAULT_INTEREST_LIFETIME)
 {
 }
 
@@ -91,7 +94,8 @@
   else {
     processSingleInsertCommand(*interest, parameter);
   }
-
+  if (parameter.hasInterestLifetime())
+    m_interestLifetime = parameter.getInterestLifetime();
 }
 
 void
@@ -233,10 +237,12 @@
   }
   process.credit = initialCredit;
   SegmentNo segment = startBlockId;
+
   for (; segment < startBlockId + initialCredit; ++segment) {
     Name fetchName = name;
     fetchName.appendSegment(segment);
     Interest interest(fetchName);
+    interest.setInterestLifetime(m_interestLifetime);
     getFace().expressInterest(interest,
                               bind(&WriteHandle::onSegmentData, this, _1, _2, processId),
                               bind(&WriteHandle::onSegmentTimeout, this, _1, processId));
@@ -330,6 +336,7 @@
   Name fetchName(interest.getName().getPrefix(-1));
   fetchName.appendSegment(sendingSegment);
   Interest fetchInterest(fetchName);
+  fetchInterest.setInterestLifetime(m_interestLifetime);
   getFace().expressInterest(fetchInterest,
                             bind(&WriteHandle::onSegmentData, this, _1, _2, processId),
                             bind(&WriteHandle::onSegmentTimeout, this, _1, processId));
@@ -380,6 +387,7 @@
     //Reput it in the queue, retryTime++
     retryTime++;
     Interest retryInterest(interest.getName());
+    retryInterest.setInterestLifetime(m_interestLifetime);
     getFace().expressInterest(retryInterest,
                               bind(&WriteHandle::onSegmentData, this, _1, _2, processId),
                               bind(&WriteHandle::onSegmentTimeout, this, _1, processId));
@@ -475,6 +483,7 @@
   response.setStatusCode(300);
 
   Interest fetchInterest(parameter.getName());
+  fetchInterest.setInterestLifetime(m_interestLifetime);
   if (parameter.hasSelectors()) {
     fetchInterest.setSelectors(parameter.getSelectors());
   }
diff --git a/src/handles/write-handle.hpp b/src/handles/write-handle.hpp
index 48bd0e4..bbbfe28 100644
--- a/src/handles/write-handle.hpp
+++ b/src/handles/write-handle.hpp
@@ -235,6 +235,7 @@
   int m_retryTime;
   int m_credit;
   ndn::time::milliseconds m_noEndTimeout;
+  ndn::time::milliseconds m_interestLifetime;
 };
 
 } // namespace repo
