Finalizing BGL-implementation of ccnx global routing controller. Also, several extensions in CcnxFib
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index e86e16b..ea8c20e 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -50,6 +50,10 @@
     module.add_class('CcnxAppHelper')
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
     module.add_class('CcnxContentObjectHeaderException')
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry [class]
+    module.add_class('CcnxFibEntry')
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces [class]
+    module.add_class('NoFaces', outer_class=root_module['ns3::CcnxFibEntry'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
     module.add_class('CcnxFibEntryContainer')
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric [class]
@@ -58,6 +62,8 @@
     module.add_enum('Status', ['NDN_FIB_GREEN', 'NDN_FIB_YELLOW', 'NDN_FIB_RED'], outer_class=root_module['ns3::CcnxFibFaceMetric'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetricContainer [struct]
     module.add_class('CcnxFibFaceMetricContainer')
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper [class]
+    module.add_class('CcnxGlobalRoutingHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper [class]
     module.add_class('CcnxHeaderHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper::Type [enumeration]
@@ -240,8 +246,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
@@ -340,10 +344,6 @@
     module.add_class('CcnxFaceContainer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFib [class]
     module.add_class('CcnxFib', parent=root_module['ns3::Object'])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry [class]
-    module.add_class('CcnxFibEntry', parent=root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces [class]
-    module.add_class('NoFaces', outer_class=root_module['ns3::CcnxFibEntry'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [class]
     module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
@@ -512,9 +512,12 @@
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
     register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
+    register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
+    register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
     register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
     register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
+    register_Ns3CcnxGlobalRoutingHelper_methods(root_module, root_module['ns3::CcnxGlobalRoutingHelper'])
     register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
     register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
     register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
@@ -586,7 +589,6 @@
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
-    register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
     register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     register_Ns3SimpleRefCount__Ns3CcnxPathWeightTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxPathWeightTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxPathWeightTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxPathWeightTracer> >'])
@@ -631,8 +633,6 @@
     register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
     register_Ns3CcnxFaceContainer_methods(root_module, root_module['ns3::CcnxFaceContainer'])
     register_Ns3CcnxFib_methods(root_module, root_module['ns3::CcnxFib'])
-    register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
-    register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
     register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
     register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
@@ -1258,6 +1258,57 @@
     cls.add_constructor([param('ns3::CcnxContentObjectHeaderException const &', 'arg0')])
     return
 
+def register_Ns3CcnxFibEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxFibEntry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxFibEntry const &', 'arg0')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
+    cls.add_method('AddOrUpdateRoutingMetric', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric const & ns3::CcnxFibEntry::FindBestCandidate(uint32_t skip=0) const [member function]
+    cls.add_method('FindBestCandidate', 
+                   'ns3::CcnxFibFaceMetric const &', 
+                   [param('uint32_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxNameComponents const & ns3::CcnxFibEntry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::CcnxNameComponents const &', 
+                   [], 
+                   is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::Invalidate() [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::RemoveFace(ns3::Ptr<ns3::CcnxFace> const & face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace > const &', 'face')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateFaceRtt(ns3::Ptr<ns3::CcnxFace> face, ns3::Time const & sample) [member function]
+    cls.add_method('UpdateFaceRtt', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::Time const &', 'sample')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateStatus(ns3::Ptr<ns3::CcnxFace> face, ns3::CcnxFibFaceMetric::Status status) [member function]
+    cls.add_method('UpdateStatus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::CcnxFibFaceMetric::Status', 'status')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_faces [variable]
+    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::CcnxFibFaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::__ccnx_private::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::Ptr< ns3::CcnxFace >, & ( ns3::CcnxFibFaceMetric::m_face ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::__ccnx_private::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::CcnxFibFaceMetric, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::CcnxFibFaceMetric::Status, & ( ns3::CcnxFibFaceMetric::m_status ) >, boost::multi_index::member< ns3::CcnxFibFaceMetric, int, & ( ns3::CcnxFibFaceMetric::m_routingCost ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::__ccnx_private::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::CcnxFibFaceMetric > >', is_const=False)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_needsProbing [variable]
+    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_prefix [variable]
+    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::CcnxNameComponents const >', is_const=False)
+    return
+
+def register_Ns3CcnxFibEntryNoFaces_methods(root_module, cls):
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces() [constructor]
+    cls.add_constructor([])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces(ns3::CcnxFibEntry::NoFaces const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxFibEntry::NoFaces const &', 'arg0')])
+    return
+
 def register_Ns3CcnxFibEntryContainer_methods(root_module, cls):
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer::CcnxFibEntryContainer() [constructor]
     cls.add_constructor([])
@@ -1300,6 +1351,33 @@
     cls.add_constructor([param('ns3::CcnxFibFaceMetricContainer const &', 'arg0')])
     return
 
+def register_Ns3CcnxGlobalRoutingHelper_methods(root_module, cls):
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper::CcnxGlobalRoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper::CcnxGlobalRoutingHelper(ns3::CcnxGlobalRoutingHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxGlobalRoutingHelper const &', 'arg0')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::AddOrigin(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::AddOrigin(std::string const & prefix, std::string const & nodeName) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('std::string const &', 'nodeName')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::CalculateRoutes() [member function]
+    cls.add_method('CalculateRoutes', 
+                   'void', 
+                   [])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::Install(ns3::Ptr<ns3::Channel> channel) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Channel >', 'channel')])
+    return
+
 def register_Ns3CcnxHeaderHelper_methods(root_module, cls):
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper::CcnxHeaderHelper() [constructor]
     cls.add_constructor([])
@@ -1364,31 +1442,6 @@
     cls.add_method('SetDefaultRoutes', 
                    'void', 
                    [param('bool', 'needSet')])
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallFakeGlobalRoutes() [member function]
-    cls.add_method('InstallFakeGlobalRoutes', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallFakeGlobalRoutesImpl() [member function]
-    cls.add_method('InstallFakeGlobalRoutesImpl', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRouteTo(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('InstallRouteTo', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRouteTo(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('InstallRouteTo', 
-                   'void', 
-                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRoutesToAll() [member function]
-    cls.add_method('InstallRoutesToAll', 
-                   'void', 
-                   [], 
-                   is_static=True)
     return
 
 def register_Ns3CcnxTraceHelper_methods(root_module, cls):
@@ -3731,18 +3784,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > const & o) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter< ns3::CcnxFibEntry > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    return
-
 def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -5267,6 +5308,10 @@
     cls.add_method('Add', 
                    'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
                    [param('ns3::CcnxNameComponents const &', 'prefix'), param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
+    ## ccnx-fib.h (module 'NDNabstraction'): boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::random_access_index_node<boost::multi_index::detail::index_node_base<ns3::CcnxFibEntry, std::allocator<ns3::CcnxFibEntry> > > >,boost::multi_index::detail::bucket_array<std::allocator<ns3::CcnxFibEntry> > > ns3::CcnxFib::Add(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix, ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix'), param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry const & ns3::CcnxFib::GetCcnxFibEntry(uint32_t index) [member function]
     cls.add_method('GetCcnxFibEntry', 
                    'ns3::CcnxFibEntry const &', 
@@ -5281,11 +5326,23 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Invalidate(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::InvalidateAll() [member function]
+    cls.add_method('InvalidateAll', 
+                   'void', 
+                   [])
     ## ccnx-fib.h (module 'NDNabstraction'): boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::random_access_index_node<boost::multi_index::detail::index_node_base<ns3::CcnxFibEntry, std::allocator<ns3::CcnxFibEntry> > > >,boost::multi_index::detail::bucket_array<std::allocator<ns3::CcnxFibEntry> > > ns3::CcnxFib::LongestPrefixMatch(ns3::CcnxInterestHeader const & interest) const [member function]
     cls.add_method('LongestPrefixMatch', 
                    'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
                    [param('ns3::CcnxInterestHeader const &', 'interest')], 
                    is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Remove(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
     ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Remove(ns3::CcnxFibEntry const & entry, ns3::Ptr<ns3::CcnxFace> face) [member function]
     cls.add_method('Remove', 
                    'void', 
@@ -5308,53 +5365,6 @@
                    visibility='protected', is_virtual=True)
     return
 
-def register_Ns3CcnxFibEntry_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxFibEntry const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxFibEntry const &', 'arg0')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxNameComponents const & prefix) [constructor]
-    cls.add_constructor([param('ns3::CcnxNameComponents const &', 'prefix')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
-    cls.add_method('AddOrUpdateRoutingMetric', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric const & ns3::CcnxFibEntry::FindBestCandidate(uint32_t skip=0) const [member function]
-    cls.add_method('FindBestCandidate', 
-                   'ns3::CcnxFibFaceMetric const &', 
-                   [param('uint32_t', 'skip', default_value='0')], 
-                   is_const=True)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxNameComponents const & ns3::CcnxFibEntry::GetPrefix() const [member function]
-    cls.add_method('GetPrefix', 
-                   'ns3::CcnxNameComponents const &', 
-                   [], 
-                   is_const=True)
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::RemoveFace(ns3::Ptr<ns3::CcnxFace> const & face) [member function]
-    cls.add_method('RemoveFace', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace > const &', 'face')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateFaceRtt(ns3::Ptr<ns3::CcnxFace> face, ns3::Time const & sample) [member function]
-    cls.add_method('UpdateFaceRtt', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::Time const &', 'sample')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateStatus(ns3::Ptr<ns3::CcnxFace> face, ns3::CcnxFibFaceMetric::Status status) [member function]
-    cls.add_method('UpdateStatus', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::CcnxFibFaceMetric::Status', 'status')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_faces [variable]
-    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::CcnxFibFaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::__ccnx_private::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::Ptr< ns3::CcnxFace >, & ( ns3::CcnxFibFaceMetric::m_face ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::__ccnx_private::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::CcnxFibFaceMetric, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::CcnxFibFaceMetric::Status, & ( ns3::CcnxFibFaceMetric::m_status ) >, boost::multi_index::member< ns3::CcnxFibFaceMetric, int, & ( ns3::CcnxFibFaceMetric::m_routingCost ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::__ccnx_private::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::CcnxFibFaceMetric > >', is_const=False)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_needsProbing [variable]
-    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_prefix [variable]
-    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::CcnxNameComponents >', is_const=False)
-    return
-
-def register_Ns3CcnxFibEntryNoFaces_methods(root_module, cls):
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces() [constructor]
-    cls.add_constructor([])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces(ns3::CcnxFibEntry::NoFaces const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxFibEntry::NoFaces const &', 'arg0')])
-    return
-
 def register_Ns3CcnxInterestHeader_methods(root_module, cls):
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader::CcnxInterestHeader(ns3::CcnxInterestHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CcnxInterestHeader const &', 'arg0')])
@@ -5564,7 +5574,7 @@
     cls.add_constructor([param('ns3::CcnxNameComponents const &', 'arg0')])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents() [constructor]
     cls.add_constructor([])
-    ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents(std::list<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
     ## ccnx-name-components.h (module 'NDNabstraction'): std::list<std::string, std::allocator<std::string> > const & ns3::CcnxNameComponents::GetComponents() const [member function]
     cls.add_method('GetComponents', 
@@ -5576,7 +5586,7 @@
                    'std::string', 
                    [], 
                    is_const=True)
-    ## ccnx-name-components.h (module 'NDNabstraction'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::CcnxNameComponents::GetSubComponents(size_t num) const [member function]
+    ## ccnx-name-components.h (module 'NDNabstraction'): std::list<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > ns3::CcnxNameComponents::GetSubComponents(size_t num) const [member function]
     cls.add_method('GetSubComponents', 
                    'std::list< boost::reference_wrapper< std::string const > >', 
                    [param('size_t', 'num')], 
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index e86e16b..ea8c20e 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -50,6 +50,10 @@
     module.add_class('CcnxAppHelper')
     ## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
     module.add_class('CcnxContentObjectHeaderException')
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry [class]
+    module.add_class('CcnxFibEntry')
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces [class]
+    module.add_class('NoFaces', outer_class=root_module['ns3::CcnxFibEntry'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
     module.add_class('CcnxFibEntryContainer')
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric [class]
@@ -58,6 +62,8 @@
     module.add_enum('Status', ['NDN_FIB_GREEN', 'NDN_FIB_YELLOW', 'NDN_FIB_RED'], outer_class=root_module['ns3::CcnxFibFaceMetric'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetricContainer [struct]
     module.add_class('CcnxFibFaceMetricContainer')
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper [class]
+    module.add_class('CcnxGlobalRoutingHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper [class]
     module.add_class('CcnxHeaderHelper')
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper::Type [enumeration]
@@ -240,8 +246,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
@@ -340,10 +344,6 @@
     module.add_class('CcnxFaceContainer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFib [class]
     module.add_class('CcnxFib', parent=root_module['ns3::Object'])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry [class]
-    module.add_class('CcnxFibEntry', parent=root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces [class]
-    module.add_class('NoFaces', outer_class=root_module['ns3::CcnxFibEntry'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [class]
     module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
@@ -512,9 +512,12 @@
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
     register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
     register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
+    register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
+    register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
     register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
     register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
+    register_Ns3CcnxGlobalRoutingHelper_methods(root_module, root_module['ns3::CcnxGlobalRoutingHelper'])
     register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
     register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
     register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
@@ -586,7 +589,6 @@
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
-    register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
     register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
     register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
     register_Ns3SimpleRefCount__Ns3CcnxPathWeightTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxPathWeightTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxPathWeightTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxPathWeightTracer> >'])
@@ -631,8 +633,6 @@
     register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
     register_Ns3CcnxFaceContainer_methods(root_module, root_module['ns3::CcnxFaceContainer'])
     register_Ns3CcnxFib_methods(root_module, root_module['ns3::CcnxFib'])
-    register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
-    register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
     register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
     register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
     register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
@@ -1258,6 +1258,57 @@
     cls.add_constructor([param('ns3::CcnxContentObjectHeaderException const &', 'arg0')])
     return
 
+def register_Ns3CcnxFibEntry_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxFibEntry const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxFibEntry const &', 'arg0')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
+    cls.add_method('AddOrUpdateRoutingMetric', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric const & ns3::CcnxFibEntry::FindBestCandidate(uint32_t skip=0) const [member function]
+    cls.add_method('FindBestCandidate', 
+                   'ns3::CcnxFibFaceMetric const &', 
+                   [param('uint32_t', 'skip', default_value='0')], 
+                   is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxNameComponents const & ns3::CcnxFibEntry::GetPrefix() const [member function]
+    cls.add_method('GetPrefix', 
+                   'ns3::CcnxNameComponents const &', 
+                   [], 
+                   is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::Invalidate() [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::RemoveFace(ns3::Ptr<ns3::CcnxFace> const & face) [member function]
+    cls.add_method('RemoveFace', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace > const &', 'face')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateFaceRtt(ns3::Ptr<ns3::CcnxFace> face, ns3::Time const & sample) [member function]
+    cls.add_method('UpdateFaceRtt', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::Time const &', 'sample')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateStatus(ns3::Ptr<ns3::CcnxFace> face, ns3::CcnxFibFaceMetric::Status status) [member function]
+    cls.add_method('UpdateStatus', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::CcnxFibFaceMetric::Status', 'status')])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_faces [variable]
+    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::CcnxFibFaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::__ccnx_private::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::Ptr< ns3::CcnxFace >, & ( ns3::CcnxFibFaceMetric::m_face ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::__ccnx_private::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::CcnxFibFaceMetric, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::CcnxFibFaceMetric::Status, & ( ns3::CcnxFibFaceMetric::m_status ) >, boost::multi_index::member< ns3::CcnxFibFaceMetric, int, & ( ns3::CcnxFibFaceMetric::m_routingCost ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::__ccnx_private::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::CcnxFibFaceMetric > >', is_const=False)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_needsProbing [variable]
+    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_prefix [variable]
+    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::CcnxNameComponents const >', is_const=False)
+    return
+
+def register_Ns3CcnxFibEntryNoFaces_methods(root_module, cls):
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces() [constructor]
+    cls.add_constructor([])
+    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces(ns3::CcnxFibEntry::NoFaces const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxFibEntry::NoFaces const &', 'arg0')])
+    return
+
 def register_Ns3CcnxFibEntryContainer_methods(root_module, cls):
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer::CcnxFibEntryContainer() [constructor]
     cls.add_constructor([])
@@ -1300,6 +1351,33 @@
     cls.add_constructor([param('ns3::CcnxFibFaceMetricContainer const &', 'arg0')])
     return
 
+def register_Ns3CcnxGlobalRoutingHelper_methods(root_module, cls):
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper::CcnxGlobalRoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): ns3::CcnxGlobalRoutingHelper::CcnxGlobalRoutingHelper(ns3::CcnxGlobalRoutingHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CcnxGlobalRoutingHelper const &', 'arg0')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::AddOrigin(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::AddOrigin(std::string const & prefix, std::string const & nodeName) [member function]
+    cls.add_method('AddOrigin', 
+                   'void', 
+                   [param('std::string const &', 'prefix'), param('std::string const &', 'nodeName')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::CalculateRoutes() [member function]
+    cls.add_method('CalculateRoutes', 
+                   'void', 
+                   [])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ccnx-global-routing-helper.h (module 'NDNabstraction'): void ns3::CcnxGlobalRoutingHelper::Install(ns3::Ptr<ns3::Channel> channel) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Channel >', 'channel')])
+    return
+
 def register_Ns3CcnxHeaderHelper_methods(root_module, cls):
     ## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxHeaderHelper::CcnxHeaderHelper() [constructor]
     cls.add_constructor([])
@@ -1364,31 +1442,6 @@
     cls.add_method('SetDefaultRoutes', 
                    'void', 
                    [param('bool', 'needSet')])
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallFakeGlobalRoutes() [member function]
-    cls.add_method('InstallFakeGlobalRoutes', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallFakeGlobalRoutesImpl() [member function]
-    cls.add_method('InstallFakeGlobalRoutesImpl', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRouteTo(ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('InstallRouteTo', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRouteTo(std::string const & prefix, ns3::Ptr<ns3::Node> node) [member function]
-    cls.add_method('InstallRouteTo', 
-                   'void', 
-                   [param('std::string const &', 'prefix'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_static=True)
-    ## ccnx-stack-helper.h (module 'NDNabstraction'): static void ns3::CcnxStackHelper::InstallRoutesToAll() [member function]
-    cls.add_method('InstallRoutesToAll', 
-                   'void', 
-                   [], 
-                   is_static=True)
     return
 
 def register_Ns3CcnxTraceHelper_methods(root_module, cls):
@@ -3731,18 +3784,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > const & o) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter< ns3::CcnxFibEntry > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    return
-
 def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -5267,6 +5308,10 @@
     cls.add_method('Add', 
                    'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
                    [param('ns3::CcnxNameComponents const &', 'prefix'), param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
+    ## ccnx-fib.h (module 'NDNabstraction'): boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::random_access_index_node<boost::multi_index::detail::index_node_base<ns3::CcnxFibEntry, std::allocator<ns3::CcnxFibEntry> > > >,boost::multi_index::detail::bucket_array<std::allocator<ns3::CcnxFibEntry> > > ns3::CcnxFib::Add(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix, ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
+    cls.add_method('Add', 
+                   'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix'), param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
     ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry const & ns3::CcnxFib::GetCcnxFibEntry(uint32_t index) [member function]
     cls.add_method('GetCcnxFibEntry', 
                    'ns3::CcnxFibEntry const &', 
@@ -5281,11 +5326,23 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Invalidate(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [member function]
+    cls.add_method('Invalidate', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::InvalidateAll() [member function]
+    cls.add_method('InvalidateAll', 
+                   'void', 
+                   [])
     ## ccnx-fib.h (module 'NDNabstraction'): boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::random_access_index_node<boost::multi_index::detail::index_node_base<ns3::CcnxFibEntry, std::allocator<ns3::CcnxFibEntry> > > >,boost::multi_index::detail::bucket_array<std::allocator<ns3::CcnxFibEntry> > > ns3::CcnxFib::LongestPrefixMatch(ns3::CcnxInterestHeader const & interest) const [member function]
     cls.add_method('LongestPrefixMatch', 
                    'boost::multi_index::detail::hashed_index_iterator< boost::multi_index::detail::hashed_index_node< boost::multi_index::detail::random_access_index_node< boost::multi_index::detail::index_node_base< ns3::CcnxFibEntry, std::allocator< ns3::CcnxFibEntry > > > >, boost::multi_index::detail::bucket_array< std::allocator< ns3::CcnxFibEntry > > >', 
                    [param('ns3::CcnxInterestHeader const &', 'interest')], 
                    is_const=True)
+    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Remove(ns3::Ptr<ns3::CcnxNameComponents const> const & prefix) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::CcnxNameComponents const > const &', 'prefix')])
     ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFib::Remove(ns3::CcnxFibEntry const & entry, ns3::Ptr<ns3::CcnxFace> face) [member function]
     cls.add_method('Remove', 
                    'void', 
@@ -5308,53 +5365,6 @@
                    visibility='protected', is_virtual=True)
     return
 
-def register_Ns3CcnxFibEntry_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxFibEntry const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxFibEntry const &', 'arg0')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::CcnxFibEntry(ns3::CcnxNameComponents const & prefix) [constructor]
-    cls.add_constructor([param('ns3::CcnxNameComponents const &', 'prefix')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::AddOrUpdateRoutingMetric(ns3::Ptr<ns3::CcnxFace> face, int32_t metric) [member function]
-    cls.add_method('AddOrUpdateRoutingMetric', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('int32_t', 'metric')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibFaceMetric const & ns3::CcnxFibEntry::FindBestCandidate(uint32_t skip=0) const [member function]
-    cls.add_method('FindBestCandidate', 
-                   'ns3::CcnxFibFaceMetric const &', 
-                   [param('uint32_t', 'skip', default_value='0')], 
-                   is_const=True)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxNameComponents const & ns3::CcnxFibEntry::GetPrefix() const [member function]
-    cls.add_method('GetPrefix', 
-                   'ns3::CcnxNameComponents const &', 
-                   [], 
-                   is_const=True)
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::RemoveFace(ns3::Ptr<ns3::CcnxFace> const & face) [member function]
-    cls.add_method('RemoveFace', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace > const &', 'face')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateFaceRtt(ns3::Ptr<ns3::CcnxFace> face, ns3::Time const & sample) [member function]
-    cls.add_method('UpdateFaceRtt', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::Time const &', 'sample')])
-    ## ccnx-fib.h (module 'NDNabstraction'): void ns3::CcnxFibEntry::UpdateStatus(ns3::Ptr<ns3::CcnxFace> face, ns3::CcnxFibFaceMetric::Status status) [member function]
-    cls.add_method('UpdateStatus', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::CcnxFace >', 'face'), param('ns3::CcnxFibFaceMetric::Status', 'status')])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_faces [variable]
-    cls.add_instance_attribute('m_faces', 'boost::multi_index::multi_index_container< ns3::CcnxFibFaceMetric, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< ns3::__ccnx_private::i_face, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::Ptr< ns3::CcnxFace >, & ( ns3::CcnxFibFaceMetric::m_face ) >, mpl_::na >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ns3::__ccnx_private::i_metric, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, boost::multi_index::composite_key< ns3::CcnxFibFaceMetric, boost::multi_index::member< ns3::CcnxFibFaceMetric, ns3::CcnxFibFaceMetric::Status, & ( ns3::CcnxFibFaceMetric::m_status ) >, boost::multi_index::member< ns3::CcnxFibFaceMetric, int, & ( ns3::CcnxFibFaceMetric::m_routingCost ) >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type >, mpl_::na >, boost::multi_index::random_access< boost::multi_index::tag< ns3::__ccnx_private::i_nth, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na > >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na >, std::allocator< ns3::CcnxFibFaceMetric > >', is_const=False)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_needsProbing [variable]
-    cls.add_instance_attribute('m_needsProbing', 'bool', is_const=False)
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::m_prefix [variable]
-    cls.add_instance_attribute('m_prefix', 'ns3::Ptr< ns3::CcnxNameComponents >', is_const=False)
-    return
-
-def register_Ns3CcnxFibEntryNoFaces_methods(root_module, cls):
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces() [constructor]
-    cls.add_constructor([])
-    ## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntry::NoFaces::NoFaces(ns3::CcnxFibEntry::NoFaces const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::CcnxFibEntry::NoFaces const &', 'arg0')])
-    return
-
 def register_Ns3CcnxInterestHeader_methods(root_module, cls):
     ## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader::CcnxInterestHeader(ns3::CcnxInterestHeader const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::CcnxInterestHeader const &', 'arg0')])
@@ -5564,7 +5574,7 @@
     cls.add_constructor([param('ns3::CcnxNameComponents const &', 'arg0')])
     ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents() [constructor]
     cls.add_constructor([])
-    ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents::CcnxNameComponents(std::list<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
     ## ccnx-name-components.h (module 'NDNabstraction'): std::list<std::string, std::allocator<std::string> > const & ns3::CcnxNameComponents::GetComponents() const [member function]
     cls.add_method('GetComponents', 
@@ -5576,7 +5586,7 @@
                    'std::string', 
                    [], 
                    is_const=True)
-    ## ccnx-name-components.h (module 'NDNabstraction'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::CcnxNameComponents::GetSubComponents(size_t num) const [member function]
+    ## ccnx-name-components.h (module 'NDNabstraction'): std::list<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,std::allocator<boost::reference_wrapper<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > ns3::CcnxNameComponents::GetSubComponents(size_t num) const [member function]
     cls.add_method('GetSubComponents', 
                    'std::list< boost::reference_wrapper< std::string const > >', 
                    [param('size_t', 'num')], 
diff --git a/helper/ccnx-global-routing-helper.cc b/helper/ccnx-global-routing-helper.cc
index 5fde9cb..b214d16 100644
--- a/helper/ccnx-global-routing-helper.cc
+++ b/helper/ccnx-global-routing-helper.cc
@@ -24,6 +24,7 @@
 #include "../model/ccnx-net-device-face.h"
 #include "../model/ccnx-global-router.h"
 #include "ns3/ccnx-name-components.h"
+#include "ns3/ccnx-fib.h"
 
 #include "ns3/node.h"
 #include "ns3/net-device.h"
@@ -35,6 +36,7 @@
 #include "ns3/channel-list.h"
 
 #include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
 #include <boost/concept/assert.hpp>
 // #include <boost/graph/graph_concepts.hpp>
 // #include <boost/graph/adjacency_list.hpp>
@@ -179,21 +181,20 @@
 void
 CcnxGlobalRoutingHelper::CalculateRoutes ()
 {
-  NS_LOG_DEBUG ("Enter");
+  /**
+   * Implementation of route calculation is heavily based on Boost Graph Library
+   * See http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/table_of_contents.html for more details
+   */
+  
   BOOST_CONCEPT_ASSERT(( VertexListGraphConcept< CcnxGlobalRouterGraph > ));
   BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept< CcnxGlobalRouterGraph > ));
-  // BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept< CcnxGlobalRouterGraph,
-  // 						     graph_traits < CcnxGlobalRouterGraph >::edge_descriptor > ));
-  // BOOST_CONCEPT_ASSERT(( PropertyGraphConcept< CcnxGlobalRouterGraph,
-  // 					       graph_traits < CcnxGlobalRouterGraph >::edge_descriptor,
-  // 					       edge_weight_t> ));
-  // BOOST_CONCEPT_ASSERT(( PropertyMapConcept< CcnxGlobalRouterGraph, edge_weight_t,
-  // 					     graph_traits < CcnxGlobalRouterGraph >::edge_descriptor> ));
-
   
   CcnxGlobalRouterGraph graph;
   typedef graph_traits < CcnxGlobalRouterGraph >::vertex_descriptor vertex_descriptor;
 
+  // For now we doing Dijkstra for every node.  Can be replaced with Bellman-Ford or Floyd-Warshall.
+  // Other algorithms should be faster, but they need additional EdgeListGraph concept provided by the graph, which
+  // is not obviously how implement in an efficient manner
   for (NodeList::Iterator node = NodeList::Begin (); node != NodeList::End (); node++)
     {
       Ptr<CcnxGlobalRouter> source = (*node)->GetObject<CcnxGlobalRouter> ();
@@ -203,7 +204,6 @@
 	  continue;
 	}
   
-      // PredecessorsMap predecessors;
       DistancesMap    distances;
 
       dijkstra_shortest_paths (graph, source,
@@ -221,8 +221,12 @@
 			       );
 
       // NS_LOG_DEBUG (predecessors.size () << ", " << distances.size ());
-  
-      cout << "Reachability from Node: " << source->GetObject<Node> ()->GetId () << endl;
+
+      Ptr<CcnxFib>  fib  = source->GetObject<CcnxFib> ();
+      fib->InvalidateAll ();
+      NS_ASSERT (fib != 0);
+      
+      // cout << "Reachability from Node: " << source->GetObject<Node> ()->GetId () << endl;
       for (DistancesMap::iterator i = distances.begin ();
 	   i != distances.end ();
 	   i++)
@@ -231,17 +235,24 @@
 	    continue;
 	  else
 	    {
-	      cout << "  Node " << i->first->GetObject<Node> ()->GetId ();
-	      if (distances[i->first].get<0> () == 0)
-		cout << " is unreachable" << endl;
+	      // cout << "  Node " << i->first->GetObject<Node> ()->GetId ();
+	      if (i->second.get<0> () == 0)
+		{
+		  // cout << " is unreachable" << endl;
+		}
 	      else
-		cout << " reachable via face " << *i->second.get<0> ()
-		     << " with distance " << i->second.get<1> () << endl;
+		{
+		// cout << " reachable via face " << *i->second.get<0> ()
+		//      << " with distance " << i->second.get<1> () << endl;
+
+		BOOST_FOREACH (const Ptr<const CcnxNameComponents> &prefix, i->first->GetLocalPrefixes ())
+		  {
+		    fib->Add (prefix, i->second.get<0> (), i->second.get<1> ());
+		  }
+		}
 	    }
 	}
-
     }
-  // NS_LOG_DEBUG ("Exit");
 }
 
 
diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
index 6cd3745..f7ebd62 100644
--- a/helper/ccnx-stack-helper.h
+++ b/helper/ccnx-stack-helper.h
@@ -171,44 +171,6 @@
   void
   SetDefaultRoutes (bool needSet);
 
-  /**
-   * \brief Install fake IPv4 routes that could be used to find nexthops for CCNx routes
-   *
-   * This method adds fake routes to all nodes, where each route is /32 and IPv4 address equal to node number.
-   * For example, node 5 will have direct route to 0.0.0.5.
-   */
-  static void
-  InstallFakeGlobalRoutes ();
-
-  static void
-  InstallFakeGlobalRoutesImpl ();
-  
-  /**
-   * \brief Install CCNx route to `node` based on fake IPv4 routes
-   *
-   * Actual route is "/<nodeId>"
-   *
-   * \param node Pointer to a node, which should be reached from all other nodes
-   */
-  static void
-  InstallRouteTo (Ptr<Node> node);
-
-  /**
-   * \brief Install CCNx route to /prefix which is installed on `node'
-   *
-   * Normally, prefix is  /<node->GetId()>.  Other values may be used in black-holing scenarios
-   */
-  static void
-  InstallRouteTo (const std::string &prefix, Ptr<Node> node);
-
-  /**
-   * \brief Install CCNx route to all nodes based on fake IPv4 routes
-   *
-   * \see InstallRouteTo
-   */
-  static void
-  InstallRoutesToAll ();
-
 private:
   CcnxStackHelper (const CcnxStackHelper &);
   CcnxStackHelper &operator = (const CcnxStackHelper &o);
@@ -219,56 +181,7 @@
   Time     m_avgRtt;
   uint32_t m_avgContentObjectSize;
   uint32_t m_avgInterestSize;
-  bool m_needSetDefaultRoutes;
-  
-  // /**
-  //  * @brief Enable pcap output the indicated Ccnx and interface pair.
-  //  * @internal
-  //  *
-  //  * @param prefix Filename prefix to use for pcap files.
-  //  * @param ccnx Ptr to the Ccnx interface on which you want to enable tracing.
-  //  * @param interface Interface ID on the Ccnx on which you want to enable tracing.
-  //  */
-  // virtual void EnablePcapCcnxInternal (std::string prefix, 
-  //                                      Ptr<Ccnx> ccnx, 
-  //                                      uint32_t interface,
-  //                                      bool explicitFilename);
-
-  // /**
-  //  * @brief Enable ascii trace output on the indicated Ccnx and interface pair.
-  //  * @internal
-  //  *
-  //  * @param stream An OutputStreamWrapper representing an existing file to use
-  //  *               when writing trace data.
-  //  * @param prefix Filename prefix to use for ascii trace files.
-  //  * @param ccnx Ptr to the Ccnx interface on which you want to enable tracing.
-  //  * @param interface Interface ID on the Ccnx on which you want to enable tracing.
-  //  */
-  // virtual void EnableAsciiCcnxInternal (Ptr<OutputStreamWrapper> stream, 
-  //                                       std::string prefix, 
-  //                                       Ptr<Ccnx> ccnx, 
-  //                                       uint32_t interface,
-  //                                       bool explicitFilename);
-
-  // // /**
-  // //  * \internal
-  // //  */
-  // // static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
-
-  // /**
-  //  * \internal
-  //  */
-  // static void Cleanup (void);
-
-  // /**
-  //  * \internal
-  //  */
-  // bool PcapHooked (Ptr<Ccnx> ccnx);
-
-  // /**
-  //  * \internal
-  //  */
-  // bool AsciiHooked (Ptr<Ccnx> ccnx);
+  bool m_needSetDefaultRoutes;  
 };
 
 } // namespace ns3
diff --git a/model/ccnx-fib.cc b/model/ccnx-fib.cc
index b068954..bfcb961 100644
--- a/model/ccnx-fib.cc
+++ b/model/ccnx-fib.cc
@@ -33,6 +33,7 @@
 #define NDN_RTO_BETA 0.25
 #define NDN_RTO_K 4
 
+#include <boost/ref.hpp>
 #include <boost/lambda/lambda.hpp>
 #include <boost/lambda/bind.hpp>
 namespace ll = boost::lambda;
@@ -138,14 +139,36 @@
     }
   else
   {
-    m_faces.modify (record,
-                    (&ll::_1)->*&CcnxFibFaceMetric::m_routingCost = metric);
+    // don't update metric to higher value
+    if (record->m_routingCost > metric || record->m_status == CcnxFibFaceMetric::NDN_FIB_RED)
+      {
+        m_faces.modify (record,
+                        (&ll::_1)->*&CcnxFibFaceMetric::m_routingCost = metric);
+
+        m_faces.modify (record,
+                        (&ll::_1)->*&CcnxFibFaceMetric::m_status = CcnxFibFaceMetric::NDN_FIB_YELLOW);
+      }
   }
   
   // reordering random access index same way as by metric index
   m_faces.get<i_nth> ().rearrange (m_faces.get<i_metric> ().begin ());
 }
 
+void
+CcnxFibEntry::Invalidate ()
+{
+  for (CcnxFibFaceMetricByFace::type::iterator face = m_faces.begin ();
+       face != m_faces.end ();
+       face++)
+    {
+      m_faces.modify (face,
+                      (&ll::_1)->*&CcnxFibFaceMetric::m_routingCost = std::numeric_limits<uint16_t>::max ());
+
+      m_faces.modify (face,
+                      (&ll::_1)->*&CcnxFibFaceMetric::m_status = CcnxFibFaceMetric::NDN_FIB_RED);
+    }
+}
+
 const CcnxFibFaceMetric &
 CcnxFibEntry::FindBestCandidate (uint32_t skip/* = 0*/) const
 {
@@ -197,9 +220,15 @@
 CcnxFibEntryContainer::type::iterator
 CcnxFib::Add (const CcnxNameComponents &prefix, Ptr<CcnxFace> face, int32_t metric)
 {
+  return Add (Create<CcnxNameComponents> (prefix), face, metric);
+}
+  
+CcnxFibEntryContainer::type::iterator
+CcnxFib::Add (const Ptr<const CcnxNameComponents> &prefix, Ptr<CcnxFace> face, int32_t metric)
+{
 // CcnxFibFaceMetric
-  NS_LOG_FUNCTION(this << prefix << face << metric);
-  CcnxFibEntryContainer::type::iterator entry = m_fib.find (prefix);
+  NS_LOG_FUNCTION(this->GetObject<Node> ()->GetId () << boost::cref(*prefix) << boost::cref(*face) << metric);
+  CcnxFibEntryContainer::type::iterator entry = m_fib.find (*prefix);
   if (entry == m_fib.end ())
     {
       entry = m_fib.insert (m_fib.end (), CcnxFibEntry (prefix));
@@ -212,7 +241,43 @@
     
   return entry;
 }
-    
+
+void
+CcnxFib::Remove (const Ptr<const CcnxNameComponents> &prefix)
+{
+  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId () << boost::cref(*prefix));
+  CcnxFibEntryContainer::type::iterator entry = m_fib.find (*prefix);
+  if (entry != m_fib.end ())
+    m_fib.erase (entry);
+}
+
+void
+CcnxFib::Invalidate (const Ptr<const CcnxNameComponents> &prefix)
+{
+  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId () << boost::cref(*prefix));
+
+  CcnxFibEntryContainer::type::iterator entry = m_fib.find (*prefix);
+  if (entry == m_fib.end ())
+    return; // nothing to invalidate
+
+  m_fib.modify (entry,
+                ll::bind (&CcnxFibEntry::Invalidate, ll::_1));
+}
+
+void
+CcnxFib::InvalidateAll ()
+{
+  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId ());
+
+  for (CcnxFibEntryContainer::type::iterator entry = m_fib.begin ();
+       entry != m_fib.end ();
+       entry ++)
+    {
+      m_fib.modify (entry,
+                    ll::bind (&CcnxFibEntry::Invalidate, ll::_1));
+    }
+}
+
 void
 CcnxFib::Remove (const CcnxFibEntry &entry, Ptr<CcnxFace> face)
 {
@@ -232,7 +297,8 @@
   NS_LOG_FUNCTION (this);
 
   for_each (m_fib.begin (), m_fib.end (), 
-            ll::bind (&CcnxFib::Remove, this, ll::_1, face));
+            ll::bind (static_cast< void (CcnxFib::*) (const CcnxFibEntry &, Ptr<CcnxFace>) > (&CcnxFib::Remove),
+                      this, ll::_1, face));
 }
 
 /**
diff --git a/model/ccnx-fib.h b/model/ccnx-fib.h
index 318bc54..36e4d6e 100644
--- a/model/ccnx-fib.h
+++ b/model/ccnx-fib.h
@@ -147,20 +147,20 @@
  * \brief Structure for FIB table entry, holding indexed list of
  *        available faces and their respective metrics
  */
-class CcnxFibEntry : public SimpleRefCount<CcnxFibEntry>
+class CcnxFibEntry // : public SimpleRefCount<CcnxFibEntry>
 {
 public:
   class NoFaces {};
   
   /**
    * \brief Constructor
-   * \param prefix Prefix for the FIB entry
+   * \param prefix smart pointer to the prefix for the FIB entry
    */
-  CcnxFibEntry (const CcnxNameComponents &prefix)
-  : m_prefix (Create<CcnxNameComponents> (prefix))
+  CcnxFibEntry (const Ptr<const CcnxNameComponents> &prefix)
+  : m_prefix (prefix)
   , m_needsProbing (false)
   { }
-	
+  
   /**
    * \brief Update status of FIB next hop
    * \param status Status to set on the FIB entry
@@ -175,6 +175,14 @@
   void AddOrUpdateRoutingMetric (Ptr<CcnxFace> face, int32_t metric);
 
   /**
+   * @brief Invalidate face
+   *
+   * Set routing metric on all faces to max and status to RED
+   */
+  void
+  Invalidate ();
+
+  /**
    * @brief Update RTT averages for the face
    */
   void
@@ -207,7 +215,7 @@
   friend std::ostream& operator<< (std::ostream& os, const CcnxFibEntry &entry);
 
 public:
-  Ptr<CcnxNameComponents> m_prefix; ///< \brief Prefix of the FIB entry
+  Ptr<const CcnxNameComponents> m_prefix; ///< \brief Prefix of the FIB entry
   CcnxFibFaceMetricContainer::type m_faces; ///< \brief Indexed list of faces
 
   bool m_needsProbing;      ///< \brief flag indicating that probing should be performed 
@@ -289,6 +297,46 @@
   Add (const CcnxNameComponents &prefix, Ptr<CcnxFace> face, int32_t metric);
 
   /**
+   * \brief Add or update FIB entry using smart pointer to prefix
+   *
+   * If the entry exists, metric will be updated. Otherwise, new entry will be created
+   *
+   * Entries in FIB never deleted. They can be invalidated with metric==NETWORK_UNREACHABLE
+   *
+   * @param name	Smart pointer to prefix
+   * @param face	Forwarding face
+   * @param metric	Routing metric
+   */
+  CcnxFibEntryContainer::type::iterator
+  Add (const Ptr<const CcnxNameComponents> &prefix, Ptr<CcnxFace> face, int32_t metric);
+
+  /**
+   * @brief Remove FIB entry
+   *
+   * ! ATTENTION ! Use with caution.  All PIT entries referencing the corresponding FIB entry will become invalid.
+   * So, simulation may crash.
+   *
+   * @param name	Smart pointer to prefix
+   */
+  void
+  Remove (const Ptr<const CcnxNameComponents> &prefix);
+
+  /**
+   * @brief Invalidate FIB entry ("Safe" version of Remove)
+   *
+   * All faces for the entry will be assigned maximum routing metric and NDN_FIB_RED status   
+   * @param name	Smart pointer to prefix
+   */
+  void
+  Invalidate (const Ptr<const CcnxNameComponents> &prefix);
+
+  /**
+   * @brief Invalidate all FIB entries
+   */
+  void
+  InvalidateAll ();
+  
+  /**
    * @brief Remove reference to a face from the entry. If entry had only this face, the whole
    * entry will be removed
    */
diff --git a/model/ccnx-global-router.cc b/model/ccnx-global-router.cc
index c61169b..8a4f767 100644
--- a/model/ccnx-global-router.cc
+++ b/model/ccnx-global-router.cc
@@ -90,6 +90,12 @@
   return m_incidencies;
 }
 
+const CcnxGlobalRouter::LocalPrefixList &
+CcnxGlobalRouter::GetLocalPrefixes () const
+{
+  return m_localPrefixes;
+}
+
 // void
 // CcnxGlobalRouter::AddIncidencyChannel (Ptr< CcnxFace > face, Ptr< Channel > channel)
 // {
diff --git a/model/ccnx-global-router.h b/model/ccnx-global-router.h
index ac7f2d6..53c9d04 100644
--- a/model/ccnx-global-router.h
+++ b/model/ccnx-global-router.h
@@ -39,6 +39,7 @@
 public:
   typedef boost::tuple< Ptr< CcnxGlobalRouter >, Ptr< CcnxFace >, Ptr< CcnxGlobalRouter > > Incidency;
   typedef std::list< Incidency > IncidencyList;
+  typedef std::list< Ptr<CcnxNameComponents> > LocalPrefixList;
   
   /**
    * \brief Interface ID
@@ -68,6 +69,9 @@
   IncidencyList &
   GetIncidencies ();
 
+  const LocalPrefixList &
+  GetLocalPrefixes () const;
+
   // ??
 protected:
   virtual void
@@ -77,7 +81,7 @@
   uint32_t m_id;
   
   Ptr<Ccnx> m_ccnx;
-  std::list< Ptr<CcnxNameComponents> > m_localPrefixes;
+  LocalPrefixList m_localPrefixes;
   IncidencyList m_incidencies;
 
   static uint32_t m_idCounter;
diff --git a/model/ccnx-net-device-face.cc b/model/ccnx-net-device-face.cc
index c09e6b2..d14e136 100644
--- a/model/ccnx-net-device-face.cc
+++ b/model/ccnx-net-device-face.cc
@@ -115,7 +115,7 @@
 std::ostream&
 CcnxNetDeviceFace::Print (std::ostream& os) const
 {
-  os << "dev=net(" << GetId () << ")";
+  os << "dev[" << GetNode ()->GetId () << "]=net(" << GetId () << ")";
   return os;
 }