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
