diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index 09c4b4f..a684069 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -1,9 +1,12 @@
 from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
 
+from pybindgen.typehandlers.smart_ptr import StdSharedPtr
+
+from ns3_ptr import Ns3PtrMemoryPolicy
+
 import pybindgen.settings
 import warnings
 
-
 import sys
 
 def module_init():
@@ -11,10 +14,293 @@
     return root_module
 
 def register_types(module):
-    return
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core',
+                     template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'],
+                     parent=module['ns3::ObjectBase'],
+                     memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    module.add_class('Object', import_from_module='ns.core', parent=module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+
+    module.add_class('TypeId', import_from_module='ns.core')
+    module.add_class('AttributeValue', import_from_module='ns.core')
+
+    module.add_class('NodeContainer', import_from_module='ns.network')
+    module.add_class('Node', import_from_module='ns.network', parent=module['ns3::Object'])
+    module.add_class('ApplicationContainer', import_from_module='ns.network')
+
+    def reg_ndn(module):
+        module.add_class('StackHelper')
+        module.add_class('FibHelper')
+        module.add_class('StrategyChoiceHelper')
+        module.add_class('AppHelper')
+        module.add_class('GlobalRoutingHelper')
+
+        module.add_class('L3Protocol', parent=module.get_root()['ns3::Object'])
+
+        module.add_class('Name')
+        module.add_class('Interest')
+        module.add_class('Data')
+        module.add_class('Face', memory_policy=StdSharedPtr('ns3::ndn::Face'))
+        module.add_class('FaceContainer', memory_policy=Ns3PtrMemoryPolicy('::ns3::ndn::FaceContainer'))
+
+        def reg_name(module):
+            module.add_class('Component')
+        reg_name(module.add_cpp_namespace('name'))
+
+        def reg_nfd(module):
+            module.add_class('Forwarder', memory_policy=StdSharedPtr('::ns3::ndn::nfd::Forwarder'), is_singleton=True)
+            module.add_class('Fib')
+            module.add_class('Pit')
+            module.add_class('Cs')
+
+            def reg_fib(module):
+                module.add_class('Entry')#, memory_policy=StdSharedPtr('ns3::ndn::nfd::fib::Entry'))
+                module.add_class('NextHop')
+                module.add_class('NextHopList')
+            reg_fib(module.add_cpp_namespace('fib'))
+
+            def reg_pit(module):
+                module.add_class('Entry')#, memory_policy=StdSharedPtr('ns3::ndn::nfd::pit::Entry'))
+            reg_pit(module.add_cpp_namespace('pit'))
+
+            def reg_cs(module):
+                module.add_class('Entry')#, memory_policy=StdSharedPtr('ns3::ndn::nfd::cs::Entry'))
+            reg_cs(module.add_cpp_namespace('cs'))
+
+        reg_nfd(module.add_cpp_namespace('nfd'))
+    reg_ndn(module.add_cpp_namespace('ndn'))
 
 def register_methods(root_module):
-    return
+    reg_other_modules(root_module)
+
+    def reg_stackhelper(cls):
+        cls.add_constructor([])
+
+        cls.add_method('Install', 'ns3::Ptr<ns3::ndn::FaceContainer>', [param('ns3::Ptr<ns3::Node>', 'node')], is_const=True)
+        cls.add_method('Install', 'ns3::Ptr<ns3::ndn::FaceContainer>', [param('std::string const&', 'nodeName')], is_const=True)
+        cls.add_method('Install', 'ns3::Ptr<ns3::ndn::FaceContainer>', [param('const ns3::NodeContainer&', 'c')], is_const=True)
+        cls.add_method('InstallAll', 'ns3::Ptr<ns3::ndn::FaceContainer>', [], is_const=True)
+
+        cls.add_method('SetDefaultRoutes', retval('void'), [param('bool', 'isEnabled', default_value='true')], is_const=True)
+        cls.add_method('SetStackAttributes',
+                       retval('void'),
+                       [param('const std::string&', 'attr1', default_value='""'), param('const std::string&', 'value1', default_value='""'),
+                        param('const std::string&', 'attr2', default_value='""'), param('const std::string&', 'value2', default_value='""'),
+                        param('const std::string&', 'attr3', default_value='""'), param('const std::string&', 'value3', default_value='""'),
+                        param('const std::string&', 'attr4', default_value='""'), param('const std::string&', 'value4', default_value='""')])
+
+        cls.add_method('setCsSize', retval('void'), [param('size_t', 'maxSize')])
+        cls.add_method('SetOldContentStore',
+                       retval('void'),
+                       [param('const std::string&', 'contentStoreClass'),
+                        param('const std::string&', 'attr1', default_value='""'), param('const std::string&', 'value1', default_value='""'),
+                        param('const std::string&', 'attr2', default_value='""'), param('const std::string&', 'value2', default_value='""'),
+                        param('const std::string&', 'attr3', default_value='""'), param('const std::string&', 'value3', default_value='""'),
+                        param('const std::string&', 'attr4', default_value='""'), param('const std::string&', 'value4', default_value='""')])
+    reg_stackhelper(root_module['ns3::ndn::StackHelper'])
+
+    def reg_fibhelper(cls):
+        cls.add_method('AddRoute', retval('void'), [
+            param('const std::string&', 'nodeName'), param('const std::string&', 'prefix'),
+            param('uint32_t', 'faceId'), param('int32_t', 'metric'),
+            ], is_const=True, is_static=True)
+        cls.add_method('AddRoute', retval('void'), [
+            param('ns3::Ptr<ns3::Node>', 'node'), param('const ns3::ndn::Name&', 'prefix'),
+            param('uint32_t', 'faceId'), param('int32_t', 'metric')
+            ], is_const=True, is_static=True)
+        cls.add_method('AddRoute', retval('void'), [
+            param('ns3::Ptr<ns3::Node>', 'node'), param('const ns3::ndn::Name&', 'prefix'),
+            param('std::shared_ptr<ns3::ndn::Face>', 'face'),
+            param('int32_t', 'metric'),
+            ], is_const=True, is_static=True)
+        cls.add_method('AddRoute', retval('void'), [
+            param('ns3::Ptr<ns3::Node>', 'node'), param('const ns3::ndn::Name&', 'prefix'),
+            param('ns3::Ptr<ns3::Node>', 'otherNode'),
+            param('int32_t', 'metric'),
+            ], is_const=True, is_static=True)
+        cls.add_method('AddRoute', retval('void'), [
+            param('const std::string&', 'nodeName'), param('const std::string&', 'prefix'),
+            param('const std::string&', 'otherNodeName'),
+            param('int32_t', 'metric'),
+            ], is_const=True, is_static=True)
+    reg_fibhelper(root_module['ns3::ndn::FibHelper'])
+
+    def reg_strategychoicehelper(cls):
+        cls.add_method('Install', retval('void'), [param('ns3::Ptr<ns3::Node>', 'node'),
+                                                   param('const const std::string&', 'name'),
+                                                   param('const const std::string&', 'strategy')], is_const=True, is_static=True)
+        cls.add_method('Install', retval('void'), [param('const ns3::NodeContainer&', 'c'),
+                                                   param('const const std::string&', 'name'),
+                                                   param('const const std::string&', 'strategy')], is_const=True, is_static=True)
+        cls.add_method('InstallAll', retval('void'), [param('const std::string&', 'name'),
+                                                      param('const std::string&', 'strategy')], is_const=True, is_static=True)
+    reg_strategychoicehelper(root_module['ns3::ndn::StrategyChoiceHelper'])
+
+    def reg_apphelper(cls):
+        cls.add_constructor([param('const std::string&', 'prefix')])
+        cls.add_method('SetPrefix', 'void', [param('const std::string&', 'prefix')])
+        cls.add_method('SetAttribute', 'void', [param('std::string', 'name'), param('const ns3::AttributeValue&', 'value')])
+        cls.add_method('Install', 'ns3::ApplicationContainer', [param('ns3::NodeContainer', 'c')])
+        cls.add_method('Install', 'ns3::ApplicationContainer', [param('ns3::Ptr<ns3::Node>', 'node')])
+        cls.add_method('Install', 'ns3::ApplicationContainer', [param('std::string', 'nodeName')])
+    reg_apphelper(root_module['ns3::ndn::AppHelper'])
+
+    def reg_GlobalRoutingHelper(cls):
+        cls.add_constructor([])
+        cls.add_method('Install', 'void', [param('ns3::Ptr<ns3::Node>', 'node')])
+        cls.add_method('Install', 'void', [param('const ns3::NodeContainer&', 'nodes')])
+        cls.add_method('InstallAll', 'void', [])
+        cls.add_method('AddOrigin', 'void', [param('const std::string&', 'prefix'), param('ns3::Ptr<ns3::Node>', 'node')])
+        cls.add_method('AddOrigin', 'void', [param('const std::string&', 'prefix'), param('const std::string&', 'nodeName')])
+        cls.add_method('AddOrigins', 'void', [param('const std::string&', 'prefix'), param('const ns3::NodeContainer&', 'nodes')])
+        cls.add_method('AddOriginsForAll', 'void', [])
+        cls.add_method('CalculateRoutes', 'void', [param('bool', 'invalidatedRoutes', default_value='true')])
+        cls.add_method('CalculateAllPossibleRoutes', 'void', [param('bool', 'invalidatedRoutes', default_value='true')])
+    reg_GlobalRoutingHelper(root_module['ns3::ndn::GlobalRoutingHelper'])
+
+    def reg_Name(root_module, cls):
+        cls.implicitly_converts_to(root_module['ns3::ndn::Interest'])
+        cls.add_output_stream_operator()
+        for op in ['==', '!=', '<', '<=', '>', '>=']:
+            cls.add_binary_comparison_operator(op)
+        cls.add_container_traits(retval('const ns3::ndn::name::Component&'),
+                                 begin_method='begin', end_method='end', iterator_type='const_iterator')
+
+        cls.add_constructor([])
+        cls.add_constructor([param('const ns3::ndn::Name&', 'other')])
+        cls.add_constructor([param('const std::string&', 'url')])
+        cls.add_method('append', 'ns3::ndn::Name &', [param('const ns3::ndn::name::Component&', 'comp')])
+        cls.add_method('get', 'const ns3::ndn::name::Component&', [param('int', 'index')], is_const=True)
+        cls.add_method('getPrefix', 'ns3::ndn::Name', [param('size_t', 'len')], is_const=True)
+        cls.add_method('size', 'size_t', [], is_const=True)
+        cls.add_method('toUri', retval('std::string'), [], is_const=True)
+    reg_Name(root_module, root_module['ns3::ndn::Name'])
+
+    def reg_NameComponent(cls):
+        cls.add_output_stream_operator()
+        for op in ['==', '!=', '<', '<=', '>', '>=']:
+            cls.add_binary_comparison_operator(op)
+
+        cls.add_constructor([param('const ns3::ndn::name::Component&', 'arg0')])
+        cls.add_constructor([])
+        cls.add_method('fromNumber', 'ns3::ndn::name::Component', [param('uint64_t', 'number')])
+        cls.add_method('fromNumberWithMarker', 'ns3::ndn::name::Component', [param('uint64_t', 'number'), param('unsigned char', 'marker')])
+        cls.add_method('fromEscapedString', 'ns3::ndn::name::Component', [param('const std::string&', 'uri')])
+    reg_NameComponent(root_module['ns3::ndn::name::Component'])
+
+    def reg_Interest(cls):
+        cls.add_output_stream_operator()
+
+        cls.add_constructor([param('const ns3::ndn::Interest&', 'interest')])
+        cls.add_constructor([])
+    reg_Interest(root_module['ns3::ndn::Interest'])
+
+    def reg_Data(cls):
+        cls.add_output_stream_operator()
+
+        cls.add_constructor([param('const ns3::ndn::Data&', 'data')])
+        cls.add_constructor([])
+    reg_Data(root_module['ns3::ndn::Data'])
+
+    #########################################################################################
+    ## Interface to NFD
+    #########################################################################################
+
+    def register_L3Protocol(cls):
+        cls.add_method('getL3Protocol', 'ns3::Ptr<ns3::ndn::L3Protocol>', [param('ns3::Ptr<ns3::Object>', 'node')], is_static=True)
+        cls.add_method('getForwarder', 'std::shared_ptr<ns3::ndn::nfd::Forwarder>', [])
+    register_L3Protocol(root_module['ns3::ndn::L3Protocol'])
+
+    def reg_Face(cls):
+        cls.add_output_stream_operator()
+        cls.add_method('getId', retval('int64_t'), [], is_const=True)
+    reg_Face(root_module['ns3::ndn::Face'])
+
+    def reg_NfdForwarder(cls):
+        cls.add_method('getFib', retval('const ns3::ndn::nfd::Fib&', caller_manages_return=False), [], is_const=True)
+        cls.add_method('getPit', retval('const ns3::ndn::nfd::Pit&', caller_manages_return=False), [], is_const=True)
+        cls.add_method('getCs', retval('const ns3::ndn::nfd::Cs&', caller_manages_return=False), [], is_const=True)
+    reg_NfdForwarder(root_module['ns3::ndn::nfd::Forwarder'])
+
+    #############
+    #### FIB ####
+    def reg_NfdFib(root_module, cls):
+        cls.add_method('size', retval('size_t'), [], is_const=True)
+        cls.add_container_traits(retval('const ns3::ndn::nfd::fib::Entry&', caller_manages_return=False),
+                                 begin_method='begin', end_method='end', iterator_type='const_iterator')
+
+        # The following is not supported
+        # cls.add_method('findLongestPrefixMatch', retval('std::shared_ptr<ns3::ndn::nfd::fib::Entry>'),
+        #                [param('const ns3::ndn::Name&', 'prefix')], is_const=True)
+        # cls.add_method('findExactMatch', retval('std::shared_ptr<ns3::ndn::nfd::fib::Entry>'),
+        #                [param('const ns3::ndn::Name&', 'prefix')], is_const=True)
+        # cls.add_method('findLongestPrefixMatch', retval('shared_ptr<ns3::ndn::nfd::fib::Entry>'),
+        #                [param('const pit::Entry&', 'pitEntry')], is_const=True)
+        # cls.add_method('findLongestPrefixMatch', retval('shared_ptr<ns3::ndn::nfd::fib::Entry>'),
+        #                [param('const measurements::Entry&', 'measurementsEntry')], is_const=True)
+
+        # cls.add_method('insert', retval('std::pair<std::shared_ptr<ns3::ndn::nfd::fib::Entry>, bool>'), [param('const ns3::ndn::Name&', 'prefix')])
+        cls.add_method('erase', retval('void'), [param('const ns3::ndn::Name&', 'prefix')])
+        cls.add_method('erase', retval('void'), [param('const ns3::ndn::nfd::fib::Entry&', 'entry')])
+        cls.add_method('removeNextHopFromAllEntries', retval('void'), [param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+
+        def reg_Entry(cls):
+            cls.add_method('getPrefix', 'const ns3::ndn::Name&', [], is_const=True)
+            cls.add_method('getNextHops', retval('const ns3::ndn::nfd::fib::NextHopList&', caller_manages_return=False), [], is_const=True)
+            cls.add_method('hasNextHops', 'bool', [], is_const=True)
+        reg_Entry(root_module['ns3::ndn::nfd::fib::Entry'])
+
+        def reg_NextHop(cls):
+            cls.add_constructor([param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+
+            cls.add_method('getFace', 'std::shared_ptr<ns3::ndn::Face>', [], is_const=True)
+            cls.add_method('setCost', 'void', [param('uint64_t', 'cost')])
+            cls.add_method('getCost', 'uint64_t', [], is_const=True)
+        reg_NextHop(root_module['ns3::ndn::nfd::fib::NextHop'])
+
+        def reg_NextHopList(cls):
+            cls.add_method('size', retval('size_t'), [], is_const=True)
+            cls.add_container_traits(retval('const ns3::ndn::nfd::fib::NextHop&', caller_manages_return=False),
+                                     begin_method='begin', end_method='end', iterator_type='const_iterator')
+        reg_NextHopList(root_module['ns3::ndn::nfd::fib::NextHopList'])
+    reg_NfdFib(root_module, root_module['ns3::ndn::nfd::Fib'])
+    #### FIB ####
+    #############
+
+    #############
+    #### PIT ####
+    def reg_NfdPit(root_module, cls):
+        cls.add_method('size', retval('size_t'), [], is_const=True)
+        cls.add_container_traits(retval('const ns3::ndn::nfd::pit::Entry&', caller_manages_return=False),
+                                 begin_method='begin', end_method='end', iterator_type='const_iterator')
+
+        def reg_Entry(cls):
+            cls.add_method('getInterest', retval('const ns3::ndn::Interest&'), [], is_const=True)
+            cls.add_method('getName', retval('const ns3::ndn::Name&'), [], is_const=True)
+        reg_Entry(root_module['ns3::ndn::nfd::pit::Entry'])
+    reg_NfdPit(root_module, root_module['ns3::ndn::nfd::Pit'])
+    #### PIT ####
+    #############
+
+    #############
+    #### CS ####
+    def reg_NfdCs(root_module, cls):
+        cls.add_method('size', retval('size_t'), [], is_const=True)
+        cls.add_container_traits(retval('const ns3::ndn::nfd::cs::Entry&', caller_manages_return=False),
+                                 begin_method='begin', end_method='end', iterator_type='const_iterator')
+
+        def reg_Entry(cls):
+            cls.add_method('getName', retval('const ns3::ndn::Name&'), [], is_const=True)
+        reg_Entry(root_module['ns3::ndn::nfd::cs::Entry'])
+    reg_NfdCs(root_module, root_module['ns3::ndn::nfd::Cs'])
+    #### CS ####
+    #############
+
+def reg_other_modules(root_module):
+    def reg_ApplicationContainer(cls):
+        cls.add_constructor([])
+        cls.add_constructor([param('ns3::ApplicationContainer', 'container')])
+    reg_ApplicationContainer(root_module['ns3::ApplicationContainer'])
 
 def register_functions(root_module):
     return
@@ -29,4 +315,3 @@
 
 if __name__ == '__main__':
     main()
-
