diff --git a/daemon/table/pit-entry.cpp b/daemon/table/pit-entry.cpp
index 7523504..86596df 100644
--- a/daemon/table/pit-entry.cpp
+++ b/daemon/table/pit-entry.cpp
@@ -10,6 +10,9 @@
 namespace nfd {
 namespace pit {
 
+const Name Entry::LOCALHOST_NAME("ndn:/localhost");
+const Name Entry::LOCALHOP_NAME("ndn:/localhop");
+
 Entry::Entry(const Interest& interest)
   : m_interest(interest)
 {
@@ -48,24 +51,24 @@
 }
 
 static inline bool
-predicate_FaceRecord_Face(const FaceRecord& faceRecord, shared_ptr<Face> face)
+predicate_FaceRecord_Face(const FaceRecord& faceRecord, const Face* face)
 {
-  return faceRecord.getFace() == face;
+  return faceRecord.getFace().get() == face;
 }
 
 static inline bool
 predicate_FaceRecord_ne_Face_and_unexpired(const FaceRecord& faceRecord,
-  shared_ptr<Face> face, time::Point now)
+  const Face* face, time::Point now)
 {
-  return faceRecord.getFace() != face && faceRecord.getExpiry() >= now;
+  return faceRecord.getFace().get() != face && faceRecord.getExpiry() >= now;
 }
 
 bool
-Entry::canForwardTo(shared_ptr<Face> face) const
+Entry::canForwardTo(const Face& face) const
 {
   OutRecordCollection::const_iterator outIt = std::find_if(
     m_outRecords.begin(), m_outRecords.end(),
-    bind(&predicate_FaceRecord_Face, _1, face));
+    bind(&predicate_FaceRecord_Face, _1, &face));
   bool hasUnexpiredOutRecord = outIt != m_outRecords.end() &&
                                outIt->getExpiry() >= time::now();
   if (hasUnexpiredOutRecord) {
@@ -74,9 +77,34 @@
 
   InRecordCollection::const_iterator inIt = std::find_if(
     m_inRecords.begin(), m_inRecords.end(),
-    bind(&predicate_FaceRecord_ne_Face_and_unexpired, _1, face, time::now()));
+    bind(&predicate_FaceRecord_ne_Face_and_unexpired, _1, &face, time::now()));
   bool hasUnexpiredOtherInRecord = inIt != m_inRecords.end();
-  return hasUnexpiredOtherInRecord;
+  if (!hasUnexpiredOtherInRecord) {
+    return false;
+  }
+
+  return !this->violatesScope(face);
+}
+
+bool
+Entry::violatesScope(const Face& face) const
+{
+  // /localhost scope
+  bool isViolatingLocalhost = !face.isLocal() &&
+                              LOCALHOST_NAME.isPrefixOf(this->getName());
+  if (isViolatingLocalhost) {
+    return true;
+  }
+
+  // /localhop scope
+  bool isViolatingLocalhop = !face.isLocal() &&
+                             LOCALHOP_NAME.isPrefixOf(this->getName()) &&
+                             !this->hasLocalInRecord();
+  if (isViolatingLocalhop) {
+    return true;
+  }
+
+  return false;
 }
 
 bool
@@ -92,7 +120,7 @@
 Entry::insertOrUpdateInRecord(shared_ptr<Face> face, const Interest& interest)
 {
   InRecordCollection::iterator it = std::find_if(m_inRecords.begin(),
-    m_inRecords.end(), bind(&predicate_FaceRecord_Face, _1, face));
+    m_inRecords.end(), bind(&predicate_FaceRecord_Face, _1, face.get()));
   if (it == m_inRecords.end()) {
     m_inRecords.push_front(InRecord(face));
     it = m_inRecords.begin();
@@ -112,7 +140,7 @@
 Entry::insertOrUpdateOutRecord(shared_ptr<Face> face, const Interest& interest)
 {
   OutRecordCollection::iterator it = std::find_if(m_outRecords.begin(),
-    m_outRecords.end(), bind(&predicate_FaceRecord_Face, _1, face));
+    m_outRecords.end(), bind(&predicate_FaceRecord_Face, _1, face.get()));
   if (it == m_outRecords.end()) {
     m_outRecords.push_front(OutRecord(face));
     it = m_outRecords.begin();
@@ -127,12 +155,25 @@
 Entry::deleteOutRecord(shared_ptr<Face> face)
 {
   OutRecordCollection::iterator it = std::find_if(m_outRecords.begin(),
-    m_outRecords.end(), bind(&predicate_FaceRecord_Face, _1, face));
+    m_outRecords.end(), bind(&predicate_FaceRecord_Face, _1, face.get()));
   if (it != m_outRecords.end()) {
     m_outRecords.erase(it);
   }
 }
 
+static inline bool
+predicate_FaceRecord_unexpired(const FaceRecord& faceRecord, time::Point now)
+{
+  return faceRecord.getExpiry() >= now;
+}
+
+bool
+Entry::hasUnexpiredOutRecords() const
+{
+  OutRecordCollection::const_iterator it = std::find_if(m_outRecords.begin(),
+    m_outRecords.end(), bind(&predicate_FaceRecord_unexpired, _1, time::now()));
+  return it != m_outRecords.end();
+}
 
 } // namespace pit
 } // namespace nfd
diff --git a/daemon/table/pit-entry.hpp b/daemon/table/pit-entry.hpp
index 1e342e2..e72365b 100644
--- a/daemon/table/pit-entry.hpp
+++ b/daemon/table/pit-entry.hpp
@@ -64,10 +64,23 @@
   /** \brief decides whether Interest can be forwarded to face
    *
    *  \return true if OutRecord of this face does not exist or has expired,
-   *          and there is an InRecord not of this face
+   *          and there is an InRecord not of this face,
+   *          and scope is not violated
    */
   bool
-  canForwardTo(shared_ptr<Face> face) const;
+  canForwardTo(const Face& face) const;
+
+  /** \brief decides whether forwarding Interest to face would violate scope
+   *
+   *  \return true if scope control would be violated
+   *  \note canForwardTo has more comprehensive checks (including scope control)
+   *        and should be used by most strategies. Outgoing Interest pipeline
+   *        should only check scope because some strategy (eg. vehicular) needs
+   *        to retransmit sooner than OutRecord expiry, or forward Interest
+   *        back to incoming face
+   */
+  bool
+  violatesScope(const Face& face) const;
 
   /** \brief records a nonce
    *
@@ -101,6 +114,11 @@
   void
   deleteOutRecord(shared_ptr<Face> face);
 
+  /** \return true if there is one or more unexpired OutRecords
+   */
+  bool
+  hasUnexpiredOutRecords() const;
+
 public:
   EventId m_unsatisfyTimer;
   EventId m_stragglerTimer;
@@ -110,6 +128,10 @@
   const Interest m_interest;
   InRecordCollection m_inRecords;
   OutRecordCollection m_outRecords;
+
+  static const Name LOCALHOST_NAME;
+  static const Name LOCALHOP_NAME;
+
   shared_ptr<name_tree::Entry> m_nameTreeEntry;
 
   friend class nfd::NameTree;
diff --git a/daemon/table/pit-face-record.cpp b/daemon/table/pit-face-record.cpp
index cbcd3b1..5663dce 100644
--- a/daemon/table/pit-face-record.cpp
+++ b/daemon/table/pit-face-record.cpp
@@ -30,7 +30,13 @@
 {
   m_lastNonce = interest.getNonce();
   m_lastRenewed = time::now();
-  m_expiry = m_lastRenewed + time::milliseconds(interest.getInterestLifetime());
+
+  const ndn::Milliseconds DEFAULT_INTEREST_LIFETIME = static_cast<ndn::Milliseconds>(4000);
+  ndn::Milliseconds lifetime = interest.getInterestLifetime();
+  if (lifetime < 0) {
+    lifetime = DEFAULT_INTEREST_LIFETIME;
+  }
+  m_expiry = m_lastRenewed + time::milliseconds(lifetime);
 }
 
 
