diff --git a/src/route/fib.cpp b/src/route/fib.cpp
index 76affde..159d358 100644
--- a/src/route/fib.cpp
+++ b/src/route/fib.cpp
@@ -60,7 +60,7 @@
 }
 
 void
-Fib::addNextHopsToFibEntryAndNfd(FibEntry& entry, const NextHopsUriSortedSet& hopsToAdd)
+Fib::addNextHopsToFibEntryAndNfd(FibEntry& entry, const NextHopsUriSortedSet& hopsToAdd, uint64_t routeFlags)
 {
   const ndn::Name& name = entry.name;
 
@@ -77,13 +77,13 @@
       registerPrefix(name, ndn::FaceUri(hop.getConnectingFaceUri()),
                      hop.getRouteCostAsAdjustedInteger(),
                      ndn::time::seconds(m_refreshTime + GRACE_PERIOD),
-                     ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
+                     routeFlags, 0);
     }
   }
 }
 
 void
-Fib::update(const ndn::Name& name, const NexthopList& allHops)
+Fib::update(const ndn::Name& name, const NexthopList& allHops, uint64_t routeFlags)
 {
   NLSR_LOG_DEBUG("Fib::update called");
 
@@ -107,7 +107,7 @@
 
     FibEntry entry;
     entry.name = name;
-    addNextHopsToFibEntryAndNfd(entry, hopsToAdd);
+    addNextHopsToFibEntryAndNfd(entry, hopsToAdd, routeFlags);
 
     entryIt = m_table.try_emplace(name, std::move(entry)).first;
   }
@@ -123,7 +123,7 @@
     }
 
     FibEntry& entry = entryIt->second;
-    addNextHopsToFibEntryAndNfd(entry, hopsToAdd);
+    addNextHopsToFibEntryAndNfd(entry, hopsToAdd, routeFlags);
 
     std::set<NextHop, NextHopUriSortedComparator> hopsToRemove;
     std::set_difference(entry.nexthopSet.begin(), entry.nexthopSet.end(),
@@ -149,7 +149,8 @@
   if (entryIt != m_table.end() &&
       !entryIt->second.refreshEventId &&
       isNotNeighbor(entryIt->second.name)) {
-    scheduleEntryRefresh(entryIt->second, [this] (FibEntry& entry) { scheduleLoop(entry); });
+    scheduleEntryRefresh(entryIt->second, routeFlags,
+                         [this] (FibEntry& entry, uint64_t routeFlags) { scheduleLoop(entry, routeFlags); });
   }
 }
 
@@ -293,7 +294,7 @@
 }
 
 void
-Fib::scheduleEntryRefresh(FibEntry& entry, const AfterRefreshCallback& refreshCallback)
+Fib::scheduleEntryRefresh(FibEntry& entry, uint64_t routeFlags, const AfterRefreshCallback& refreshCallback)
 {
   NLSR_LOG_DEBUG("Scheduling refresh for " << entry.name <<
                  " Seq Num: " << entry.seqNo <<
@@ -301,23 +302,22 @@
 
   entry.refreshEventId = m_scheduler.schedule(ndn::time::seconds(m_refreshTime),
                                               std::bind(&Fib::refreshEntry, this,
-                                                        entry.name, refreshCallback));
+                                                        entry.name, routeFlags, refreshCallback));
 }
 
 void
-Fib::scheduleLoop(FibEntry& entry)
+Fib::scheduleLoop(FibEntry& entry, uint64_t routeFlags)
 {
-  scheduleEntryRefresh(entry, std::bind(&Fib::scheduleLoop, this, _1));
+  scheduleEntryRefresh(entry, routeFlags, std::bind(&Fib::scheduleLoop, this, _1, _2));
 }
 
 void
-Fib::refreshEntry(const ndn::Name& name, AfterRefreshCallback refreshCb)
+Fib::refreshEntry(const ndn::Name& name, uint64_t routeFlags, AfterRefreshCallback refreshCb)
 {
   auto it = m_table.find(name);
   if (it == m_table.end()) {
     return;
   }
-
   FibEntry& entry = it->second;
   NLSR_LOG_DEBUG("Refreshing " << entry.name << " Seq Num: " << entry.seqNo);
 
@@ -328,10 +328,10 @@
                    ndn::FaceUri(hop.getConnectingFaceUri()),
                    hop.getRouteCostAsAdjustedInteger(),
                    ndn::time::seconds(m_refreshTime + GRACE_PERIOD),
-                   ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
+                   routeFlags, 0);
   }
 
-  refreshCb(entry);
+  refreshCb(entry, routeFlags);
 }
 
 void
diff --git a/src/route/fib.hpp b/src/route/fib.hpp
index 7be0001..ade5779 100644
--- a/src/route/fib.hpp
+++ b/src/route/fib.hpp
@@ -41,7 +41,7 @@
   NextHopsUriSortedSet nexthopSet;
 };
 
-using AfterRefreshCallback = std::function<void(FibEntry&)>;
+using AfterRefreshCallback = std::function<void(FibEntry&, uint64_t)>;
 
 class AdjacencyList;
 class ConfParameter;
@@ -86,9 +86,10 @@
    *
    * \param name The name prefix that the next-hops apply to
    * \param allHops A complete list of next-hops to associate with name.
+   * \param routeFlags Route inheritance flags
    */
   void
-  update(const ndn::Name& name, const NexthopList& allHops);
+  update(const ndn::Name& name, const NexthopList& allHops, uint64_t routeFlags);
 
   void
   setEntryRefreshTime(int32_t fert)
@@ -145,7 +146,7 @@
    * \sa Fib::removeOldNextHopsFromFibEntryAndNfd
    */
   void
-  addNextHopsToFibEntryAndNfd(FibEntry& entry, const NextHopsUriSortedSet& hopsToAdd);
+  addNextHopsToFibEntryAndNfd(FibEntry& entry, const NextHopsUriSortedSet& hopsToAdd, uint64_t routeFlags);
 
   unsigned int
   getNumberOfFacesForName(const NexthopList& nextHopList);
@@ -194,18 +195,18 @@
    * \sa Fib::scheduleLoop
    */
   void
-  scheduleEntryRefresh(FibEntry& entry, const AfterRefreshCallback& refreshCb);
+  scheduleEntryRefresh(FibEntry& entry, uint64_t routeFlags, const AfterRefreshCallback& refreshCb);
 
 private:
   /*! \brief Continue the entry refresh cycle.
    */
   void
-  scheduleLoop(FibEntry& entry);
+  scheduleLoop(FibEntry& entry, uint64_t routeFlags);
 
   /*! \brief Refreshes an entry in NFD.
    */
   void
-  refreshEntry(const ndn::Name& name, AfterRefreshCallback refreshCb);
+  refreshEntry(const ndn::Name& name, uint64_t routeFlags, AfterRefreshCallback refreshCb);
 
 public:
   static inline const ndn::Name MULTICAST_STRATEGY{"/localhost/nfd/strategy/multicast"};
diff --git a/src/route/name-prefix-table-entry.hpp b/src/route/name-prefix-table-entry.hpp
index d808018..b19fe40 100644
--- a/src/route/name-prefix-table-entry.hpp
+++ b/src/route/name-prefix-table-entry.hpp
@@ -38,8 +38,9 @@
   {
   }
 
-  NamePrefixTableEntry(const ndn::Name& namePrefix)
+  NamePrefixTableEntry(const ndn::Name& namePrefix, uint64_t routeFlags)
     : m_namePrefix(namePrefix)
+    , m_flags(routeFlags)
     , m_nexthopList()
   {
   }
@@ -87,6 +88,18 @@
     return m_nexthopList;
   }
 
+  void
+  setFlags(uint64_t flags)
+  {
+    m_flags = flags;
+  }
+
+  uint64_t
+  getFlags() const
+  {
+    return m_flags;
+  }
+
   /*! \brief Collect all next-hops that are advertised by this entry's
    * routing entries.
    */
@@ -114,6 +127,7 @@
 
 private:
   ndn::Name m_namePrefix;
+  uint64_t m_flags;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   std::list<std::shared_ptr<RoutingTablePoolEntry>> m_rteList;
diff --git a/src/route/name-prefix-table.cpp b/src/route/name-prefix-table.cpp
index ea4fc16..ba521ba 100644
--- a/src/route/name-prefix-table.cpp
+++ b/src/route/name-prefix-table.cpp
@@ -78,7 +78,8 @@
       for (const auto &prefix : nlsa->getNpl().getPrefixInfo()) {
         if (prefix.getName() != m_ownRouterName) {
           m_nexthopCost[DestNameKey(lsa->getOriginRouter(), prefix.getName())] = prefix.getCost();
-          addEntry(prefix.getName(), lsa->getOriginRouter());
+          // Don't use capture flag on advertised prefixes...
+          addEntry(prefix.getName(), lsa->getOriginRouter(), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
         }
       }
     }
@@ -91,7 +92,8 @@
     for (const auto &prefix : namesToAdd) {
       if (prefix.getName() != m_ownRouterName) {
         m_nexthopCost[DestNameKey(lsa->getOriginRouter(), prefix.getName())] = prefix.getCost();
-        addEntry(prefix.getName(), lsa->getOriginRouter());
+        // Don't use capture flag on advertised prefixes...
+        addEntry(prefix.getName(), lsa->getOriginRouter(), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
       }
     }
 
@@ -129,7 +131,7 @@
 }
 
 void
-NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
+NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter, uint64_t routeFlags)
 {
   // Check if the advertised name prefix is in the table already.
   auto nameItr = std::find_if(m_table.begin(), m_table.end(),
@@ -169,7 +171,8 @@
   if (nameItr == m_table.end()) {
     NLSR_LOG_DEBUG("Adding origin: " << rtpePtr->getDestination()
                    << " to a new name prefix: " << name);
-    npte = std::make_shared<NamePrefixTableEntry>(name);
+
+    npte = std::make_shared<NamePrefixTableEntry>(name, ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
     npte->addRoutingTableEntry(rtpePtr);
     npte->generateNhlfromRteList();
     m_table.push_back(npte);
@@ -177,7 +180,7 @@
     // If this entry has next hops, we need to inform the FIB
     if (npte->getNexthopList().size() > 0) {
       NLSR_LOG_TRACE("Updating FIB with next hops for " << npte->getNamePrefix());
-      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter));
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
     // The routing table may recalculate and add a routing table entry
     // with no next hops to replace an existing routing table entry. In
@@ -193,13 +196,16 @@
   else {
     npte = *nameItr;
     NLSR_LOG_TRACE("Adding origin: " << rtpePtr->getDestination() <<
-                   " to existing prefix: " << **nameItr);
-    (*nameItr)->addRoutingTableEntry(rtpePtr);
-    (*nameItr)->generateNhlfromRteList();
-
-    if ((*nameItr)->getNexthopList().size() > 0) {
-      NLSR_LOG_TRACE("Updating FIB with next hops for " << (**nameItr));
-      m_fib.update(name, adjustNexthopCosts((*nameItr)->getNexthopList(), name, destRouter));
+                   " to existing prefix: " << *npte);
+    // We should not downgrade the capture flag to child-inherit unless there are no nexthops
+    if (npte->getFlags() != routeFlags && npte->getNexthopList().size() == 0) {
+      npte->setFlags(routeFlags);
+    }
+    npte->addRoutingTableEntry(rtpePtr);
+    npte->generateNhlfromRteList();
+    if (npte->getNexthopList().size() > 0) {
+      NLSR_LOG_TRACE("Updating FIB with next hops for " << *npte);
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
     else {
       NLSR_LOG_TRACE(npte->getNamePrefix() << " has no next hops; removing from FIB");
@@ -233,12 +239,13 @@
   auto nameItr = std::find_if(m_table.begin(), m_table.end(),
                               [&] (const auto& entry) { return entry->getNamePrefix() == name; });
   if (nameItr != m_table.end()) {
+    std::shared_ptr<NamePrefixTableEntry> npte = *nameItr;
     NLSR_LOG_TRACE("Removing origin: " << rtpePtr->getDestination()
                    << " from prefix: " << **nameItr);
 
     // Rather than iterating through the whole list periodically, just
     // delete them here if they have no references.
-    if ((*nameItr)->removeRoutingTableEntry(rtpePtr) == 0) {
+    if (npte->removeRoutingTableEntry(rtpePtr) == 0) {
       deleteRtpeFromPool(rtpePtr);
     }
 
@@ -257,17 +264,17 @@
     //   Prefix Table. Once a new Name LSA advertises this prefix, a
     //   new entry for the prefix will be created.
     //
-    if ((*nameItr)->getRteListSize() == 0) {
-      NLSR_LOG_TRACE(**nameItr << " has no routing table entries;"
+    if (npte->getRteListSize() == 0) {
+      NLSR_LOG_TRACE(*npte << " has no routing table entries;"
                      << " removing from table and FIB");
       m_table.erase(nameItr);
       m_fib.remove(name);
     }
     else {
-      NLSR_LOG_TRACE(**nameItr << " has other routing table entries;"
+      NLSR_LOG_TRACE(*npte << " has other routing table entries;"
                      << " updating FIB with next hops");
       (*nameItr)->generateNhlfromRteList();
-      m_fib.update(name, adjustNexthopCosts((*nameItr)->getNexthopList(), name, destRouter));
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
   }
   else {
@@ -295,7 +302,7 @@
       poolEntry->setNexthopList(sourceEntry->getNexthopList());
       for (const auto& nameEntry : poolEntry->namePrefixTableEntries) {
         auto nameEntryFullPtr = nameEntry.second.lock();
-        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination());
+        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination(), nameEntryFullPtr->getFlags());
       }
     }
     else if (sourceEntry == entries.end()) {
@@ -303,7 +310,7 @@
       poolEntry->getNexthopList().clear();
       for (const auto& nameEntry : poolEntry->namePrefixTableEntries) {
         auto nameEntryFullPtr = nameEntry.second.lock();
-        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination());
+        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination(), nameEntryFullPtr->getFlags());
       }
     }
     else {
diff --git a/src/route/name-prefix-table.hpp b/src/route/name-prefix-table.hpp
index 8fca574..c39b5f4 100644
--- a/src/route/name-prefix-table.hpp
+++ b/src/route/name-prefix-table.hpp
@@ -66,6 +66,7 @@
   /*! \brief Adds a destination to the specified name prefix.
     \param name The name prefix
     \param destRouter The destination router prefix
+    \param routeFlags Route inheritance flags from NFD
 
     This method adds a router to a name prefix table entry. If the
     name prefix table entry does not exist, it is created. The method
@@ -77,7 +78,7 @@
     notified of the change to the NPT entry, too.
    */
   void
-  addEntry(const ndn::Name& name, const ndn::Name& destRouter);
+  addEntry(const ndn::Name& name, const ndn::Name& destRouter, uint64_t routeFlags = ndn::nfd::ROUTE_FLAG_CAPTURE);
 
   /*! \brief Removes a destination from a name prefix table entry.
     \param name The name prefix
