model: small API change with ndn::ForwardingStrategy
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index 3836b99..c7a3d98 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -348,17 +348,17 @@
     module.add_class('L3Protocol', parent=root_module['ns3::Object'])
     ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits [class]
     module.add_class('Limits', parent=root_module['ns3::Object'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name [class]
     module.add_class('Name', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
     module.add_class('NameChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents [class]
     module.add_class('NameComponents', parent=root_module['ns3::ndn::Name'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker [class]
     module.add_class('NameComponentsChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue [class]
     module.add_class('NameComponentsValue', parent=root_module['ns3::AttributeValue'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
     module.add_class('NameValue', parent=root_module['ns3::AttributeValue'])
     ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace [class]
     module.add_class('NetDeviceFace', parent=root_module['ns3::ndn::Face'])
@@ -435,6 +435,8 @@
     
     ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry [class]
     module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty [struct]
+    module.add_class('EntryIsNotEmpty')
     ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace [struct]
     module.add_class('IncomingFace')
     ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace [struct]
@@ -604,6 +606,7 @@
     register_Ns3NdnFibI_nth_methods(root_module, root_module['ns3::ndn::fib::i_nth'])
     register_Ns3NdnFwTag_methods(root_module, root_module['ns3::ndn::fw::Tag'])
     register_Ns3NdnPitEntry_methods(root_module, root_module['ns3::ndn::pit::Entry'])
+    register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, root_module['ns3::ndn::pit::EntryIsNotEmpty'])
     register_Ns3NdnPitIncomingFace_methods(root_module, root_module['ns3::ndn::pit::IncomingFace'])
     register_Ns3NdnPitOutgoingFace_methods(root_module, root_module['ns3::ndn::pit::OutgoingFace'])
     register_Ns3NdnPitI_face_methods(root_module, root_module['ns3::ndn::pit::i_face'])
@@ -5122,10 +5125,15 @@
                    'void', 
                    [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::InterestHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
                    visibility='protected', is_virtual=True)
-    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket) [member function]
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveSolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveSolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, bool didCreateCacheEntry) [member function]
     cls.add_method('DidReceiveUnsolicitedData', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket')], 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('bool', 'didCreateCacheEntry')], 
                    visibility='protected', is_virtual=True)
     ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
     cls.add_method('DidSendOutData', 
@@ -5233,10 +5241,11 @@
     cls.add_constructor([])
     ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper(ns3::ndn::HeaderHelper const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::HeaderHelper const &', 'arg0')])
-    ## ndn-header-helper.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::Name> ns3::ndn::HeaderHelper::GetName(ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## ndn-header-helper.h (module 'ndnSIM'): static ns3::Ptr<const ns3::ndn::Name> ns3::ndn::HeaderHelper::GetName(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('GetName', 
                    'ns3::Ptr< ns3::ndn::Name const >', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_static=True)
     ## ndn-header-helper.h (module 'ndnSIM'): static ns3::ndn::HeaderHelper::Type ns3::ndn::HeaderHelper::GetNdnHeaderType(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('GetNdnHeaderType', 
                    'ns3::ndn::HeaderHelper::Type', 
@@ -5495,74 +5504,74 @@
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('==')
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::Name const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(char const * prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(char const * prefix) [constructor]
     cls.add_constructor([param('char const *', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Deserialize(ns3::Buffer::Iterator start) [member function]
+    ## ndn-name.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')])
-    ## ndn-name-components.h (module 'ndnSIM'): std::list<std::string, std::allocator<std::string> > const & ns3::ndn::Name::GetComponents() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::list<std::string, std::allocator<std::string> > const & ns3::ndn::Name::GetComponents() const [member function]
     cls.add_method('GetComponents', 
                    'std::list< std::string > const &', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::Name::GetLastComponent() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::Name::GetLastComponent() const [member function]
     cls.add_method('GetLastComponent', 
                    'std::string', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): size_t ns3::ndn::Name::GetSerializedSize() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): size_t ns3::ndn::Name::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'size_t', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::ndn::Name::GetSubComponents(size_t num) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::ndn::Name::GetSubComponents(size_t num) const [member function]
     cls.add_method('GetSubComponents', 
                    'std::list< boost::reference_wrapper< std::string const > >', 
                    [param('size_t', 'num')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::Name::Print(std::ostream & os) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::Name::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::begin() [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::begin() [member function]
     cls.add_method('begin', 
                    'std::_List_iterator< std::string >', 
                    [])
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::begin() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::begin() const [member function]
     cls.add_method('begin', 
                    'std::_List_const_iterator< std::string >', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::cut(size_t minusComponents) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::cut(size_t minusComponents) const [member function]
     cls.add_method('cut', 
                    'ns3::ndn::Name', 
                    [param('size_t', 'minusComponents')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::end() [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::end() [member function]
     cls.add_method('end', 
                    'std::_List_iterator< std::string >', 
                    [])
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::end() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::end() const [member function]
     cls.add_method('end', 
                    'std::_List_const_iterator< std::string >', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
     cls.add_method('size', 
                    'size_t', 
                    [], 
@@ -5570,93 +5579,93 @@
     return
 
 def register_Ns3NdnNameChecker_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameChecker const &', 'arg0')])
     return
 
 def register_Ns3NdnNameComponents_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(ns3::ndn::NameComponents const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(ns3::ndn::NameComponents const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponents const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::string const & prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(char const * prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(char const * prefix) [constructor]
     cls.add_constructor([param('char const *', 'prefix')])
     return
 
 def register_Ns3NdnNameComponentsChecker_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker(ns3::ndn::NameComponentsChecker const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker(ns3::ndn::NameComponentsChecker const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponentsChecker const &', 'arg0')])
     return
 
 def register_Ns3NdnNameComponentsValue_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponentsValue const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponentsValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponentsValue const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponents const & value) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponents const & value) [constructor]
     cls.add_constructor([param('ns3::ndn::NameComponents const &', 'value')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameComponentsValue::Copy() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameComponentsValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): bool ns3::ndn::NameComponentsValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    ## ndn-name.h (module 'ndnSIM'): bool ns3::ndn::NameComponentsValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents ns3::ndn::NameComponentsValue::Get() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents ns3::ndn::NameComponentsValue::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::ndn::NameComponents', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::NameComponentsValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::NameComponentsValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::NameComponentsValue::Set(ns3::ndn::NameComponents const & value) [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::NameComponentsValue::Set(ns3::ndn::NameComponents const & value) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::ndn::NameComponents const &', 'value')])
     return
 
 def register_Ns3NdnNameValue_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameValue const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
     cls.add_constructor([param('ns3::ndn::Name const &', 'value')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    ## ndn-name.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::ndn::Name', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::ndn::Name const &', 'value')])
@@ -5778,6 +5787,10 @@
     cls.add_method('SetFib', 
                    'void', 
                    [param('std::string const &', 'fibClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::AddNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::EnableLimits(bool enable=true, ns3::Time avgRtt=ns3::Seconds( ), uint32_t avgContentObject=1100, uint32_t avgInterest=40) [member function]
     cls.add_method('EnableLimits', 
                    'void', 
@@ -6133,6 +6146,18 @@
                    is_virtual=True)
     return
 
+def register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, cls):
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty(ns3::ndn::pit::EntryIsNotEmpty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::EntryIsNotEmpty const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::EntryIsNotEmpty::operator()(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   custom_name='__call__')
+    return
+
 def register_Ns3NdnPitIncomingFace_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('<')
@@ -6199,11 +6224,11 @@
     return
 
 def register_functions_ns3_ndn(module, root_module):
-    ## ndn-name-components.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
+    ## ndn-name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
     module.add_function('MakeNameChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
-    ## ndn-name-components.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameComponentsChecker() [free function]
+    ## ndn-name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameComponentsChecker() [free function]
     module.add_function('MakeNameComponentsChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index 3836b99..c7a3d98 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -348,17 +348,17 @@
     module.add_class('L3Protocol', parent=root_module['ns3::Object'])
     ## ndn-limits.h (module 'ndnSIM'): ns3::ndn::Limits [class]
     module.add_class('Limits', parent=root_module['ns3::Object'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name [class]
     module.add_class('Name', parent=root_module['ns3::SimpleRefCount< ns3::ndn::Name, ns3::empty, ns3::DefaultDeleter<ns3::ndn::Name> >'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker [class]
     module.add_class('NameChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents [class]
     module.add_class('NameComponents', parent=root_module['ns3::ndn::Name'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker [class]
     module.add_class('NameComponentsChecker', parent=root_module['ns3::AttributeChecker'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue [class]
     module.add_class('NameComponentsValue', parent=root_module['ns3::AttributeValue'])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue [class]
     module.add_class('NameValue', parent=root_module['ns3::AttributeValue'])
     ## ndn-net-device-face.h (module 'ndnSIM'): ns3::ndn::NetDeviceFace [class]
     module.add_class('NetDeviceFace', parent=root_module['ns3::ndn::Face'])
@@ -435,6 +435,8 @@
     
     ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::Entry [class]
     module.add_class('Entry', parent=root_module['ns3::SimpleRefCount< ns3::ndn::pit::Entry, ns3::empty, ns3::DefaultDeleter<ns3::ndn::pit::Entry> >'])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty [struct]
+    module.add_class('EntryIsNotEmpty')
     ## ndn-pit-entry-incoming-face.h (module 'ndnSIM'): ns3::ndn::pit::IncomingFace [struct]
     module.add_class('IncomingFace')
     ## ndn-pit-entry-outgoing-face.h (module 'ndnSIM'): ns3::ndn::pit::OutgoingFace [struct]
@@ -604,6 +606,7 @@
     register_Ns3NdnFibI_nth_methods(root_module, root_module['ns3::ndn::fib::i_nth'])
     register_Ns3NdnFwTag_methods(root_module, root_module['ns3::ndn::fw::Tag'])
     register_Ns3NdnPitEntry_methods(root_module, root_module['ns3::ndn::pit::Entry'])
+    register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, root_module['ns3::ndn::pit::EntryIsNotEmpty'])
     register_Ns3NdnPitIncomingFace_methods(root_module, root_module['ns3::ndn::pit::IncomingFace'])
     register_Ns3NdnPitOutgoingFace_methods(root_module, root_module['ns3::ndn::pit::OutgoingFace'])
     register_Ns3NdnPitI_face_methods(root_module, root_module['ns3::ndn::pit::i_face'])
@@ -5122,10 +5125,15 @@
                    'void', 
                    [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::InterestHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('ns3::Ptr< ns3::ndn::pit::Entry >', 'pitEntry')], 
                    visibility='protected', is_virtual=True)
-    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket) [member function]
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveSolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, bool didCreateCacheEntry) [member function]
+    cls.add_method('DidReceiveSolicitedData', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('bool', 'didCreateCacheEntry')], 
+                   visibility='protected', is_virtual=True)
+    ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidReceiveUnsolicitedData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, bool didCreateCacheEntry) [member function]
     cls.add_method('DidReceiveUnsolicitedData', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket')], 
+                   [param('ns3::Ptr< ns3::ndn::Face >', 'inFace'), param('ns3::Ptr< ns3::ndn::ContentObjectHeader const >', 'header'), param('ns3::Ptr< ns3::Packet const >', 'payload'), param('ns3::Ptr< ns3::Packet const >', 'origPacket'), param('bool', 'didCreateCacheEntry')], 
                    visibility='protected', is_virtual=True)
     ## ndn-forwarding-strategy.h (module 'ndnSIM'): void ns3::ndn::ForwardingStrategy::DidSendOutData(ns3::Ptr<ns3::ndn::Face> inFace, ns3::Ptr<ns3::ndn::Face> outFace, ns3::Ptr<ns3::ndn::ContentObjectHeader const> header, ns3::Ptr<const ns3::Packet> payload, ns3::Ptr<const ns3::Packet> origPacket, ns3::Ptr<ns3::ndn::pit::Entry> pitEntry) [member function]
     cls.add_method('DidSendOutData', 
@@ -5233,10 +5241,11 @@
     cls.add_constructor([])
     ## ndn-header-helper.h (module 'ndnSIM'): ns3::ndn::HeaderHelper::HeaderHelper(ns3::ndn::HeaderHelper const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::HeaderHelper const &', 'arg0')])
-    ## ndn-header-helper.h (module 'ndnSIM'): ns3::Ptr<const ns3::ndn::Name> ns3::ndn::HeaderHelper::GetName(ns3::Ptr<const ns3::Packet> packet) [member function]
+    ## ndn-header-helper.h (module 'ndnSIM'): static ns3::Ptr<const ns3::ndn::Name> ns3::ndn::HeaderHelper::GetName(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('GetName', 
                    'ns3::Ptr< ns3::ndn::Name const >', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')], 
+                   is_static=True)
     ## ndn-header-helper.h (module 'ndnSIM'): static ns3::ndn::HeaderHelper::Type ns3::ndn::HeaderHelper::GetNdnHeaderType(ns3::Ptr<const ns3::Packet> packet) [member function]
     cls.add_method('GetNdnHeaderType', 
                    'ns3::ndn::HeaderHelper::Type', 
@@ -5495,74 +5504,74 @@
     cls.add_output_stream_operator()
     cls.add_binary_comparison_operator('<')
     cls.add_binary_comparison_operator('==')
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(ns3::ndn::Name const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::Name const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name::Name(char const * prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name::Name(char const * prefix) [constructor]
     cls.add_constructor([param('char const *', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Deserialize(ns3::Buffer::Iterator start) [member function]
+    ## ndn-name.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Deserialize(ns3::Buffer::Iterator start) [member function]
     cls.add_method('Deserialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')])
-    ## ndn-name-components.h (module 'ndnSIM'): std::list<std::string, std::allocator<std::string> > const & ns3::ndn::Name::GetComponents() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::list<std::string, std::allocator<std::string> > const & ns3::ndn::Name::GetComponents() const [member function]
     cls.add_method('GetComponents', 
                    'std::list< std::string > const &', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::Name::GetLastComponent() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::Name::GetLastComponent() const [member function]
     cls.add_method('GetLastComponent', 
                    'std::string', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): size_t ns3::ndn::Name::GetSerializedSize() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): size_t ns3::ndn::Name::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'size_t', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::ndn::Name::GetSubComponents(size_t num) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > ns3::ndn::Name::GetSubComponents(size_t num) const [member function]
     cls.add_method('GetSubComponents', 
                    'std::list< boost::reference_wrapper< std::string const > >', 
                    [param('size_t', 'num')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::Name::Print(std::ostream & os) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::Name::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Serialize(ns3::Buffer::Iterator start) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): uint32_t ns3::ndn::Name::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'uint32_t', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::begin() [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::begin() [member function]
     cls.add_method('begin', 
                    'std::_List_iterator< std::string >', 
                    [])
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::begin() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::begin() const [member function]
     cls.add_method('begin', 
                    'std::_List_const_iterator< std::string >', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::cut(size_t minusComponents) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::Name::cut(size_t minusComponents) const [member function]
     cls.add_method('cut', 
                    'ns3::ndn::Name', 
                    [param('size_t', 'minusComponents')], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::end() [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_iterator<std::string> ns3::ndn::Name::end() [member function]
     cls.add_method('end', 
                    'std::_List_iterator< std::string >', 
                    [])
-    ## ndn-name-components.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::end() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::_List_const_iterator<std::string> ns3::ndn::Name::end() const [member function]
     cls.add_method('end', 
                    'std::_List_const_iterator< std::string >', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): size_t ns3::ndn::Name::size() const [member function]
     cls.add_method('size', 
                    'size_t', 
                    [], 
@@ -5570,93 +5579,93 @@
     return
 
 def register_Ns3NdnNameChecker_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameChecker::NameChecker(ns3::ndn::NameChecker const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameChecker const &', 'arg0')])
     return
 
 def register_Ns3NdnNameComponents_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(ns3::ndn::NameComponents const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(ns3::ndn::NameComponents const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponents const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::list<boost::reference_wrapper<std::string const>, std::allocator<boost::reference_wrapper<std::string const> > > const & components) [constructor]
     cls.add_constructor([param('std::list< boost::reference_wrapper< std::string const > > const &', 'components')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::string const & prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(std::string const & prefix) [constructor]
     cls.add_constructor([param('std::string const &', 'prefix')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(char const * prefix) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents::NameComponents(char const * prefix) [constructor]
     cls.add_constructor([param('char const *', 'prefix')])
     return
 
 def register_Ns3NdnNameComponentsChecker_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker(ns3::ndn::NameComponentsChecker const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsChecker::NameComponentsChecker(ns3::ndn::NameComponentsChecker const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponentsChecker const &', 'arg0')])
     return
 
 def register_Ns3NdnNameComponentsValue_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponentsValue const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponentsValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameComponentsValue const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponents const & value) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponentsValue::NameComponentsValue(ns3::ndn::NameComponents const & value) [constructor]
     cls.add_constructor([param('ns3::ndn::NameComponents const &', 'value')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameComponentsValue::Copy() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameComponentsValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): bool ns3::ndn::NameComponentsValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    ## ndn-name.h (module 'ndnSIM'): bool ns3::ndn::NameComponentsValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameComponents ns3::ndn::NameComponentsValue::Get() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameComponents ns3::ndn::NameComponentsValue::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::ndn::NameComponents', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::NameComponentsValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::NameComponentsValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::NameComponentsValue::Set(ns3::ndn::NameComponents const & value) [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::NameComponentsValue::Set(ns3::ndn::NameComponents const & value) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::ndn::NameComponents const &', 'value')])
     return
 
 def register_Ns3NdnNameValue_methods(root_module, cls):
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue() [constructor]
     cls.add_constructor([])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::NameValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::ndn::NameValue const &', 'arg0')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::NameValue::NameValue(ns3::ndn::Name const & value) [constructor]
     cls.add_constructor([param('ns3::ndn::Name const &', 'value')])
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::Ptr<ns3::AttributeValue> ns3::ndn::NameValue::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::AttributeValue >', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    ## ndn-name.h (module 'ndnSIM'): bool ns3::ndn::NameValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
     cls.add_method('DeserializeFromString', 
                    'bool', 
                    [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
+    ## ndn-name.h (module 'ndnSIM'): ns3::ndn::Name ns3::ndn::NameValue::Get() const [member function]
     cls.add_method('Get', 
                    'ns3::ndn::Name', 
                    [], 
                    is_const=True)
-    ## ndn-name-components.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    ## ndn-name.h (module 'ndnSIM'): std::string ns3::ndn::NameValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
     cls.add_method('SerializeToString', 
                    'std::string', 
                    [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
                    is_const=True, is_virtual=True)
-    ## ndn-name-components.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
+    ## ndn-name.h (module 'ndnSIM'): void ns3::ndn::NameValue::Set(ns3::ndn::Name const & value) [member function]
     cls.add_method('Set', 
                    'void', 
                    [param('ns3::ndn::Name const &', 'value')])
@@ -5778,6 +5787,10 @@
     cls.add_method('SetFib', 
                    'void', 
                    [param('std::string const &', 'fibClass'), param('std::string const &', 'attr1', default_value='""'), param('std::string const &', 'value1', default_value='""'), param('std::string const &', 'attr2', default_value='""'), param('std::string const &', 'value2', default_value='""'), param('std::string const &', 'attr3', default_value='""'), param('std::string const &', 'value3', default_value='""'), param('std::string const &', 'attr4', default_value='""'), param('std::string const &', 'value4', default_value='""')])
+    ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::AddNetDeviceFaceCreateCallback(ns3::TypeId netDeviceType, ns3::Callback<ns3::Ptr<ns3::ndn::NetDeviceFace>,ns3::Ptr<ns3::Node>,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddNetDeviceFaceCreateCallback', 
+                   'void', 
+                   [param('ns3::TypeId', 'netDeviceType'), param('ns3::Callback< ns3::Ptr< ns3::ndn::NetDeviceFace >, ns3::Ptr< ns3::Node >, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
     ## ndn-stack-helper.h (module 'ndnSIM'): void ns3::ndn::StackHelper::EnableLimits(bool enable=true, ns3::Time avgRtt=ns3::Seconds( ), uint32_t avgContentObject=1100, uint32_t avgInterest=40) [member function]
     cls.add_method('EnableLimits', 
                    'void', 
@@ -6133,6 +6146,18 @@
                    is_virtual=True)
     return
 
+def register_Ns3NdnPitEntryIsNotEmpty_methods(root_module, cls):
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty() [constructor]
+    cls.add_constructor([])
+    ## ndn-pit-entry.h (module 'ndnSIM'): ns3::ndn::pit::EntryIsNotEmpty::EntryIsNotEmpty(ns3::ndn::pit::EntryIsNotEmpty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ndn::pit::EntryIsNotEmpty const &', 'arg0')])
+    ## ndn-pit-entry.h (module 'ndnSIM'): bool ns3::ndn::pit::EntryIsNotEmpty::operator()(ns3::Ptr<ns3::ndn::pit::Entry> entry) [member operator]
+    cls.add_method('operator()', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::ndn::pit::Entry >', 'entry')], 
+                   custom_name='__call__')
+    return
+
 def register_Ns3NdnPitIncomingFace_methods(root_module, cls):
     cls.add_binary_comparison_operator('==')
     cls.add_binary_comparison_operator('<')
@@ -6199,11 +6224,11 @@
     return
 
 def register_functions_ns3_ndn(module, root_module):
-    ## ndn-name-components.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
+    ## ndn-name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameChecker() [free function]
     module.add_function('MakeNameChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
-    ## ndn-name-components.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameComponentsChecker() [free function]
+    ## ndn-name.h (module 'ndnSIM'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::ndn::MakeNameComponentsChecker() [free function]
     module.add_function('MakeNameComponentsChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
                         [])
diff --git a/model/fw/ndn-forwarding-strategy.cc b/model/fw/ndn-forwarding-strategy.cc
index 2b026c9..6dc5bb0 100644
--- a/model/fw/ndn-forwarding-strategy.cc
+++ b/model/fw/ndn-forwarding-strategy.cc
@@ -226,11 +226,34 @@
   Ptr<pit::Entry> pitEntry = m_pit->Lookup (*header);
   if (pitEntry == 0)
     {
-      DidReceiveUnsolicitedData (inFace, header, payload, origPacket);
+      bool cached = false;
+
+      if (m_cacheUnsolicitedData)
+        {
+          FwHopCountTag hopCountTag;
+
+          Ptr<Packet> payloadCopy = payload->Copy ();
+          payloadCopy->RemovePacketTag (hopCountTag);
+
+          // Optimistically add or update entry in the content store
+          cached = m_contentStore->Add (header, payloadCopy);
+        }
+      else
+        {
+          // Drop data packet if PIT entry is not found
+          // (unsolicited data packets should not "poison" content store)
+
+          //drop dulicated or not requested data packet
+          m_dropData (header, payload, inFace);
+        }
+
+      DidReceiveUnsolicitedData (inFace, header, payload, origPacket, cached);
       return;
     }
   else
     {
+      bool cached = false;
+
       FwHopCountTag hopCountTag;
       if (payload->PeekPacketTag (hopCountTag))
         {
@@ -238,13 +261,15 @@
           payloadCopy->RemovePacketTag (hopCountTag);
 
           // Add or update entry in the content store
-          m_contentStore->Add (header, payloadCopy);
+          cached = m_contentStore->Add (header, payloadCopy);
         }
       else
         {
           // Add or update entry in the content store
-          m_contentStore->Add (header, payload); // no need for extra copy
+          cached = m_contentStore->Add (header, payload); // no need for extra copy
         }
+
+      DidReceiveSolicitedData (inFace, header, payload, origPacket, cached);
     }
 
   while (pitEntry != 0)
@@ -391,29 +416,23 @@
 }
 
 void
+ForwardingStrategy::DidReceiveSolicitedData (Ptr<Face> inFace,
+                                             Ptr<const ContentObjectHeader> header,
+                                             Ptr<const Packet> payload,
+                                             Ptr<const Packet> origPacket,
+                                             bool didCreateCacheEntry)
+{
+  // do nothing
+}
+
+void
 ForwardingStrategy::DidReceiveUnsolicitedData (Ptr<Face> inFace,
                                                Ptr<const ContentObjectHeader> header,
                                                Ptr<const Packet> payload,
-                                               Ptr<const Packet> origPacket)
+                                               Ptr<const Packet> origPacket,
+                                               bool didCreateCacheEntry)
 {
-  if (m_cacheUnsolicitedData)
-    {
-      FwHopCountTag hopCountTag;
-
-      Ptr<Packet> payloadCopy = payload->Copy ();
-      payloadCopy->RemovePacketTag (hopCountTag);
-
-      // Optimistically add or update entry in the content store
-      m_contentStore->Add (header, payloadCopy);
-    }
-  else
-    {
-      // Drop data packet if PIT entry is not found
-      // (unsolicited data packets should not "poison" content store)
-
-      //drop dulicated or not requested data packet
-      m_dropData (header, payload, inFace);
-    }
+  // do nothing
 }
 
 void
diff --git a/model/fw/ndn-forwarding-strategy.h b/model/fw/ndn-forwarding-strategy.h
index b838565..04b34a2 100644
--- a/model/fw/ndn-forwarding-strategy.h
+++ b/model/fw/ndn-forwarding-strategy.h
@@ -62,7 +62,7 @@
 
   /**
    * \brief Actual processing of incoming Ndn interests. Note, interests do not have payload
-   * 
+   *
    * Processing Interest packets
    * @param face    incoming face
    * @param header  deserialized Interest header
@@ -75,7 +75,7 @@
 
   /**
    * \brief Actual processing of incoming Ndn content objects
-   * 
+   *
    * Processing ContentObject packets
    * @param face    incoming face
    * @param header  deserialized ContentObject header
@@ -101,7 +101,7 @@
    */
   virtual void
   AddFace (Ptr<Face> face);
-  
+
   /**
    * @brief Event fired every time face is removed from NDN stack
    * @param face face to be removed
@@ -124,7 +124,7 @@
    */
   virtual void
   WillRemoveFibEntry (Ptr<fib::Entry> fibEntry);
-  
+
 protected:
   /**
    * @brief An event that is fired every time a new PIT entry is created
@@ -132,7 +132,7 @@
    * Note that if NDN node is receiving a similar interest (interest for the same name),
    * then either DidReceiveDuplicateInterest, DidSuppressSimilarInterest, or DidForwardSimilarInterest
    * will be called
-   * 
+   *
    * Suppression of similar Interests is controlled using ShouldSuppressIncomingInterest virtual method
    *
    * @param inFace  incoming face
@@ -147,13 +147,13 @@
                      Ptr<const InterestHeader> header,
                      Ptr<const Packet> origPacket,
                      Ptr<pit::Entry> pitEntry);
-  
+
   /**
    * @brief An event that is fired every time a new PIT entry cannot be created (e.g., PIT container imposes a limit)
    *
    * Note that this call can be called only for non-similar Interest (i.e., there is an attempt to create a new PIT entry).
    * For any non-similar Interests, either FailedToCreatePitEntry or DidCreatePitEntry is called.
-   * 
+   *
    * @param inFace  incoming face
    * @param header  deserialized Interest header
    * @param origPacket  original packet
@@ -162,7 +162,7 @@
   FailedToCreatePitEntry (Ptr<Face> inFace,
                           Ptr<const InterestHeader> header,
                           Ptr<const Packet> origPacket);
-  
+
   /**
    * @brief An event that is fired every time a duplicated Interest is received
    *
@@ -262,7 +262,7 @@
    * Note that when Interest is satisfied from the cache, incoming face will be 0
    *
    * @param inFace  incoming face
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest   
+   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
    */
   virtual void
   WillSatisfyPendingInterest (Ptr<Face> inFace,
@@ -305,6 +305,22 @@
                   Ptr<pit::Entry> pitEntry);
 
   /**
+   * @brief Event which is fired every time a requested (solicited) DATA packet (there is an active PIT entry) is received
+   *
+   * @param inFace  incoming face
+   * @param header  deserialized ContentObject header
+   * @param payload ContentObject payload
+   * @param origPacket  original packet
+   * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
+   */
+  virtual void
+  DidReceiveSolicitedData (Ptr<Face> inFace,
+                           Ptr<const ContentObjectHeader> header,
+                           Ptr<const Packet> payload,
+                           Ptr<const Packet> origPacket,
+                           bool didCreateCacheEntry);
+
+  /**
    * @brief Event which is fired every time an unsolicited DATA packet (no active PIT entry) is received
    *
    * The current implementation allows ignoring unsolicited DATA (by default), or cache it by setting
@@ -314,12 +330,14 @@
    * @param header  deserialized ContentObject header
    * @param payload ContentObject payload
    * @param origPacket  original packet
+   * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
    */
   virtual void
   DidReceiveUnsolicitedData (Ptr<Face> inFace,
                              Ptr<const ContentObjectHeader> header,
                              Ptr<const Packet> payload,
-                             Ptr<const Packet> origPacket);
+                             Ptr<const Packet> origPacket,
+                             bool didCreateCacheEntry);
 
   /**
    * @brief Method implementing logic to suppress (collapse) similar Interests
@@ -362,7 +380,7 @@
                       Ptr<const InterestHeader> header,
                       Ptr<const Packet> origPacket,
                       Ptr<pit::Entry> pitEntry);
-  
+
   /**
    * @brief Method implementing actual interest forwarding, taking into account CanSendOutInterest decision
    *
@@ -417,7 +435,7 @@
                      Ptr<const InterestHeader> header,
                      Ptr<const Packet> origPacket,
                      Ptr<pit::Entry> pitEntry);
-  
+
   /**
    * @brief Virtual method to perform Interest propagation according to the forwarding strategy logic
    *
@@ -442,20 +460,20 @@
                        Ptr<const InterestHeader> header,
                        Ptr<const Packet> origPacket,
                        Ptr<pit::Entry> pitEntry) = 0;
-  
+
 protected:
-  // inherited from Object class                                                                                                                                                        
+  // inherited from Object class
   virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
   virtual void DoDispose (); ///< @brief Do cleanup
-  
-protected:  
+
+protected:
   Ptr<Pit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
-  Ptr<Fib> m_fib; ///< \brief FIB  
+  Ptr<Fib> m_fib; ///< \brief FIB
   Ptr<ContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
 
   bool m_cacheUnsolicitedData;
   bool m_detectRetransmissions;
-  
+
   TracedCallback<Ptr<const InterestHeader>,
                  Ptr<const Face> > m_outInterests; ///< @brief Transmitted interests trace
 
@@ -464,7 +482,7 @@
 
   TracedCallback<Ptr<const InterestHeader>,
                  Ptr<const Face> > m_dropInterests; ///< @brief trace of dropped Interests
-  
+
   ////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////////////